2017-10-17 84 views
1

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

--apply其中AR3 = 1:ar2/ar2[:,0][:, np.newaxis]

--apply其中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()

回答

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]]) 

此仅计算其占用的内存更少必要的值(和可能是也更快)。

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) 
相关问题