如何将数组中的掩码应用于numpy中的另一个矩阵

时间:2017-10-17 01:23:34

标签: python arrays pandas numpy

如何在numpy中应用蒙版来获得此输出?

ar2 = np.arange(1,26)[::-1].reshape([5,5]).T
ar3 = np.array([1,1,-1,-1,1])
print ar2, '\n\n',  ar3

[[25 20 15 10  5]
 [24 19 14  9  4]
 [23 18 13  8  3]
 [22 17 12  7  2]
 [21 16 11  6  1]] 

[ 1  1 -1 -1  1]

- 适用于ar3 = 1:ar2/ar2[:,0][:, np.newaxis]

的地方

- 适用于ar3 = -1:ar2/ar2[:,4][:, np.newaxis]

的地方

我追求的结果是:

[[1 0 0 0 0]
 [1 0 0 0 0]
 [ 7  6  4  2  1]
 [11  8  6  3  1]
 [1 0 0 0 0]]

我试过了np.where()

2 个答案:

答案 0 :(得分:3)

我不明白为什么np.where不应该在这里工作:

>>> np.where((ar3==1)[:, None], 
...          ar2 // ar2[:, [0]],  # where condition is True, divide by first column
...          ar2 // ar2[:, [4]])  # where condition is False, divide by last column
array([[ 1,  0,  0,  0,  0],
       [ 1,  0,  0,  0,  0],
       [ 7,  6,  4,  2,  1],
       [11,  8,  6,  3,  1],
       [ 1,  0,  0,  0,  0]])

我使用Python 3,这就是为什么我使用//(分区)而不是常规分区(/),否则结果将包含浮点数。

这会急切地计算数组,因此它会为所有值评估ar2 // ar2[:, [0]] ar2 // ar2[:, [4]]。在内存中有效保存3个大小为ar2的数组(结果和两个临时值)。如果你想要更高的内存效率,你需要在执行操作之前应用掩码:

>>> res = np.empty_like(ar2)
>>> mask = ar3 == 1
>>> res[mask] = ar2[mask] // ar2[mask][:, [0]]
>>> res[~mask] = ar2[~mask] // ar2[~mask][:, [4]]
>>> res
array([[ 1,  0,  0,  0,  0],
       [ 1,  0,  0,  0,  0],
       [ 7,  6,  4,  2,  1],
       [11,  8,  6,  3,  1],
       [ 1,  0,  0,  0,  0]])

这只计算使用较少内存的必要值(也可能更快)。

答案 1 :(得分:2)

不是最优雅的,但这是我能想到的。

m = ar3 == -1
a = (ar2 // ar2[:, [0]])
a[m] = (ar2 // ar2[:, [4]])[m]

print(a)
array([[ 1,  0,  0,  0,  0],
       [ 1,  0,  0,  0,  0],
       [ 7,  6,  4,  2,  1],
       [11,  8,  6,  3,  1],
       [ 1,  0,  0,  0,  0]], dtype=int32)