2016-12-22 1 views
1

aにはnumpyの配列(2つの要素リストのリスト)があり、私が探したい2要素のリスト[30.94, 0.]があります。numpy.where関数の何が問題ですか?

私が次のことをしたとき、私は望みの結果を得られませんでした。どうして?

import numpy as np 
a = np.array([[ 5.73, 0. ], 
       [ 57.73, 10. ], 
       [ 57.73, 20. ], 
       [ 30.94, 0. ], 
       [ 30.94, 10. ], 
       [ 30.94, 20. ], 
       [ 4.14, 0. ], 
       [ 4.14, 10. ]]) 

np.where(a==np.array([30.94, 0.])) 

しかし、私は真実ではありません

(array([0, 3, 3, 4, 5, 6]), array([1, 0, 1, 0, 0, 1])) 

を取得します。

+0

質問? - あなたは 'A == np.array(と何を期待し、[30.94、0]' – Divakar

+0

それは 'べきである[3]、[3]'行のインデックスのためにと'[0、1]'のようなものです。 – drzbir

+0

Nahは、 'np.where'なしでは' a == np.array([30.94、0.] ')という意味です。 – Divakar

答えて

4

Divakarが暗示しているように、a == np.array([30.94, 0.])はあなたが期待するものではありません。配列はブロードキャストされ、比較は要素単位で行われます。

array([[False, True], 
     [False, False], 
     [False, False], 
     [ True, True], 
     [ True, False], 
     [ True, False], 
     [False, True], 
     [False, False]], dtype=bool) 

しかし、我々は我々がnp.allで欲しいものを得ることができます:予想通り

>>> np.all(a==np.array([30.94, 0.]), axis=-1) 
array([False, False, False, True, False, False, False, False], dtype=bool) 
>>> np.where(_) 
(array([3]),) 

は、だからあなたは、その行に3つの試合を見ることができるここでの結果です。浮動小数点数で==を使用するための通常の注意事項がここで適用されることに注意してください。

+2

浮動小数点数を考慮するために、 – Divakar

+1

@ kmario23 "broadcast"は、 "broadcast"の有効な過去分詞です。 –

+0

@DietrichEpp私はそれを実現しましたが、それを「ed」形式にするのがより自然であると感じました。それを指摘してくれてありがとう、b tw! – kmario23

1

さらに大きな解決策がありますが、これは特に大きな配列の場合はDietrich's solutionよりも少し遅くなることに注意してください。バックあなたの

In [1]: cond = np.array([30.94, 0.]) 
In [2]: arr = np.array([[ 5.73, 0. ], 
         [ 57.73, 10. ], 
         [ 57.73, 20. ], 
         [ 30.94, 0. ], 
         [ 30.94, 10. ], 
         [ 30.94, 20. ], 
         [ 4.14, 0. ], 
         [ 4.14, 10. ]]) 

In [3]: [idx for idx, el in enumerate(arr) if np.array_equal(el, cond)] 
Out[3]: [3] 
関連する問題