2017-03-01 109 views
2

我是NumPy的新手,並且遇到了在numpy數組上運行一些條件語句的問題。比方說,我有一個看起來像這樣3個numpy的數組:對numpy數組的條件操作

一個:

​​

B:

[[6, 9, 8, 6], 
[7, 7, 9, 6], 
[8, 6, 5, 7]] 

和c:

[[0, 0, 0, 0], 
[0, 0, 0, 0], 
[0, 0, 0, 0]] 

我有一個條件語句對於a和b,我希望使用b的值(如果符合a和b的條件)來計算c的值:

c[(a > 3) & (b > 8)]+=b*2 

我得到一個錯誤說:

Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
ValueError: non-broadcastable output operand with shape (1,) doesn't match the broadcast shape (3,4) 

任何想法如何,我可以做到這一點?

我想C的輸出如下所示:

[[0, 18, 0, 0], 
[0, 0, 0, 0], 
[0, 0, 0, 0]] 
+0

謝謝!在每個人工作的同時讚揚每個人。我接受了來自@Psidom的np.where的答案,因爲它對我來說最有意義並且運行速度最快(我的實際腳本將運行這些條件幾百萬次) – bobby12345

回答

7

您可以使用numpy.where

np.where((a > 3) & (b > 8), c + b*2, c) 
#array([[ 0, 18, 0, 0], 
#  [ 0, 0, 0, 0], 
#  [ 0, 0, 0, 0]]) 

或者算術:

c + b*2 * ((a > 3) & (b > 8)) 
#array([[ 0, 18, 0, 0], 
#  [ 0, 0, 0, 0], 
#  [ 0, 0, 0, 0]]) 
6

的問題是,你屏蔽接收部分,但不能掩蓋發件人部分。因此:

c[(a > 3) & (b > 8)]+=b*2 
#^1x1 matrix  ^3x4 matrix 

尺寸不一樣。由於要執行元素方面除了(根據你的例子),你可以簡單地將切片添加到右側的部分,以及:

c[(a > 3) & (b > 8)]+=b[(a > 3) & (b > 8)]*2

或使其更高效:

mask = (a > 3) & (b > 8) 
c[mask] = b[mask]*2
1

在numpy的表達會得到理想的效果略有變化:

c += ((a > 3) & (b > 8)) * b*2 

在這裏首先創建包含布爾值的掩碼矩陣,從((a > 3) & (b > 8)),然後乘以矩陣b*2這又產生3x4矩陣,可以很容易地添加到c