如何在 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()
最佳答案
我不明白为什么 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,这就是为什么我使用 //
(地板除法)而不是常规除法(/
),否则结果将包含 float 。
这会急切地计算数组,因此它计算 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]])
这仅计算使用较少内存的必要值(并且可能也更快)。
关于python - 如何将掩码从数组应用到numpy中的另一个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46781143/