2015-04-17 26 views
1

請注意, NumPy:NumpPy中的數組表達式

import numpy as np 
A = np.ones((5,5))*3 
print A 

[[ 3. 3. 3. 3. 3.] 
[ 3. 3. 3. 3. 3.] 
[ 3. 3. 3. 3. 3.] 
[ 3. 3. 3. 3. 3.] 
[ 3. 3. 3. 3. 3.]] 

B = np.ones((5,5))*5 
print B 
[[ 5. 5. 5. 5. 5.] 
[ 5. 5. 5. 5. 5.] 
[ 5. 5. 5. 5. 5.] 
[ 5. 5. 5. 5. 5.] 
[ 5. 5. 5. 5. 5.]] 


C = np.ones((5,5)) 
C[0:2,0:2] = 99 
print C 

[[ 99. 99. 1. 1. 1.] 
[ 99. 99. 1. 1. 1.] 
[ 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1.]] 

A,B和C是給定的條件。我想計算A,B之間C值爲99的最大值;並將結果放入A.以下代碼正常工作。

A[C==99] = np.max([A, B],axis=0)[C==99] 

print A 

預期的結果是:

[[ 5. 5. 3. 3. 3.] 
[ 5. 5. 3. 3. 3.] 
[ 3. 3. 3. 3. 3.] 
[ 3. 3. 3. 3. 3.] 
[ 3. 3. 3. 3. 3.]] 

不過,我想知道是否有解決它的更好的方法。我的意思是更simplier,更快,更簡單的方法...

回答

1

你可以在這裏使用boolean indexing,從而避免調用np.max像這樣 -

mask = (B>A) & (C==99) 
A[mask] = B[mask] 

基本上,我們將值插入A只是其中B值大於A,因此複製max標準,然後與C的條件重疊,即99C==99。這給了我們一個布爾數組或掩碼,如第一行代碼所列。然後,我們使用此掩碼來映射AB,並在第二行代碼中將掩碼值從B傳送到A.


這裏有一個樣品運行(相比於一個在一開始的價值發現在一月底的價值變化) -

In [66]: A 
Out[66]: 
array([[2, 2, 4, 6, 2, 3], 
     [6, 4, 2, 4, 3, 5], 
     [5, 4, 4, 3, 6, 4], 
     [4, 2, 4, 5, 6, 5], 
     [2, 5, 5, 5, 2, 5]]) 

In [67]: B 
Out[67]: 
array([[5, 4, 6, 4, 5, 3], 
     [5, 6, 3, 4, 7, 6], 
     [7, 3, 5, 3, 7, 5], 
     [7, 3, 6, 4, 6, 7], 
     [7, 4, 7, 7, 3, 6]]) 

In [68]: C 
Out[68]: 
array([[100, 99, 100, 100, 99, 100], 
     [100, 99, 99, 100, 100, 100], 
     [ 99, 99, 100, 99, 100, 100], 
     [100, 100, 100, 100, 100, 100], 
     [100, 99, 99, 100, 99, 99]]) 

In [69]: mask = (B>A) & (C==99) 

In [70]: A[mask] = B[mask] 

In [71]: A 
Out[71]: 
array([[2, 4, 4, 6, 5, 3], 
     [6, 6, 3, 4, 3, 5], 
     [7, 4, 4, 3, 6, 4], 
     [4, 2, 4, 5, 6, 5], 
     [2, 5, 7, 5, 3, 6]]) 
2

你可以Divakar的水溶液轉化成一個班輪使用np.where

np.where((C == 99) & (B > A), B, A) 

的語法是:

np.where(<mask>, <value_if_mask>, <value_if_not_mask>)