2017-10-17 82 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) 
相關問題