我有两个2D Numpy数组,比方说:
A1 = [[5,3]
[4,6]]
和
A2 = [[7,9]
[5,0]]
我希望能够选择A1的索引,例如[1][0]
,它给我选择的值为4。
现在,无论两个对应元素都不为零,我都想从A1
中逐个减去A2
。但是,在所选值小于A1元素的情况下,我想减去该所选值而不是A1元素。
在这种情况下,这意味着我的最终结果是:
A3 = [[3,6]
[1,0]]
这是因为4小于5,所以我从A2[0][0]
中减去4。 4不大于3,因此我从A2[0][1]
中减去3。 4等于4,所以我从A2[1][0]
中减去4。 A2中的最终值不是非零,因此我将其保留。
对不起,我没有代码尝试,因为我根本不知道该怎么做。
答案 0 :(得分:2)
一种方法是使用numpy.where
,它使我们可以根据条件在两个数组之间进行选择。我们首先构建一个掩码数组,该数组为A1
和A2
均为非零的True,否则为False。我将您选择的值称为val
。只要将val
和A1
的最小值设为val
大于A1
的任何地方,就可以使用val
。这是逐步的过程,所以我们可以看到发生了什么。
import numpy as np
A1 = np.array([[5, 3], [4, 6]])
A2 = np.array([[7, 9], [5, 0]])
print(A1, '\n')
print(A2, '\n')
# Selected indices of A1
row, col = 1, 0
val = A1[row, col]
print(val)
# Find where both A1 & A2 are nonzero
mask = (A1 != 0) & (A2 != 0)
print(mask, '\n')
# Replace values in A1 that are greater than val
A1a = np.minimum(A1, val)
print(A1a, '\n')
# Only do the subtraction where both A1 & A2 are nonzero,
# otherwise copy the A2 value
A3 = np.where(mask, A2 - A1a, A2)
print(A3, '\n')
输出
[[5 3]
[4 6]]
[[7 9]
[5 0]]
4
[[ True True]
[ True False]]
[[4 3]
[4 4]]
[[3 6]
[1 0]]
然后一行:
A3 = np.where((A1 != 0) & (A2 != 0), A2 - np.minimum(A1, val), A2)
一个密切相关的版本是:
A3 = A2 - np.where((A1 != 0) & (A2 != 0), np.minimum(A1, val), 0)
这是Andras Deak提供的另一种版本,与np.where
类似,但是在mask
包含大量False条目时应该更快:
A3 = A2.copy()
A3[mask] -= np.minimum(A1, val)[mask]