在两个数组都不为零的情况下,如何减去一个特定值?

时间:2018-07-02 21:01:08

标签: python arrays numpy

我有两个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中的最终值不是非零,因此我将其保留。

对不起,我没有代码尝试,因为我根本不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

一种方法是使用numpy.where,它使我们可以根据条件在两个数组之间进行选择。我们首先构建一个掩码数组,该数组为A1A2均为非零的True,否则为False。我将您选择的值称为val。只要将valA1的最小值设为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]