Skip to main content
 首页 » 编程设计

python之如何将掩码从数组应用到numpy中的另一个矩阵

2025年05月04日19insus

如何在 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]]) 

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