2017-03-01 13 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について、cの値を計算するために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

ありがとう!彼らがすべて働いていたみんなのアップアップ。 np.whereの@Psidomからの回答を受け入れてくれました。それは最も感謝していました。私の実際のスクリプトでは、数百万回もこれらの条件が実行されます。 – 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