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

标签 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()

最佳答案

我不明白为什么 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/

相关文章:

python - 将 3D 数组元素与 1D 数组相加

javascript - Javascript 中 boolean 值和数组的困难

javascript - 返回 JavaScript 中字符串中最短单词的长度

python - 根据 pandas 中的列索引在 csv 文件导入期间定义数据类型

Python PANDAS : New Column, 将唯一值应用于所有行

python - 更新表中数据的正确方法?

python - 如何在Python中使用websocket api?

归并排序算法的Python实现

python - 如何使用 python statsmodel 计算 Cooks 距离、DFFITS

java - 数组未接收单选按钮值