2017-02-01 5 views
2

以下のnumpyの動作を理解できます。どのようにnumpy.where仕事ですか?

>>> a 
array([[ 0. , 0. , 0. ], 
     [ 0. , 0.7, 0. ], 
     [ 0. , 0.3, 0.5], 
     [ 0.6, 0. , 0.8], 
     [ 0.7, 0. , 0. ]]) 
>>> argmax_overlaps = a.argmax(axis=1) 
>>> argmax_overlaps 
array([0, 1, 2, 2, 0]) 
>>> max_overlaps = a[np.arange(5),argmax_overlaps] 
>>> max_overlaps 
array([ 0. , 0.7, 0.5, 0.8, 0.7]) 
>>> gt_argmax_overlaps = a.argmax(axis=0) 
>>> gt_argmax_overlaps 
array([4, 1, 3]) 
>>> gt_max_overlaps = a[gt_argmax_overlaps,np.arange(a.shape[1])] 
>>> gt_max_overlaps 
array([ 0.7, 0.7, 0.8]) 
>>> gt_argmax_overlaps = np.where(a == gt_max_overlaps) 
>>> gt_argmax_overlaps 
(array([1, 3, 4]), array([1, 2, 0])) 

Iは、[1,1]で0.7、0.7および0.8を理解[3,2]及び[4,0]私は0次及び1からなる各アレイれたタプル(array[1,3,4] and array[1,2,0])を得これらの3つの要素のインデックス。次に私の理解が正しいことを見て他の例を試しました。

>>> np.where(a == [0.3]) 
(array([2]), array([1])) 

0.3は[2,1]ですので、結果は期待通りです。それで試しました。

>>> np.where(a == [0.3, 0.5]) 
(array([], dtype=int64),) 

??私は(array([2,2])、array([2,3]))を見たいと思っていました。上記の結果がなぜ表示されるのですか?

>>> np.where(a == [0.7, 0.7, 0.8]) 
(array([1, 3, 4]), array([1, 2, 0])) 
>>> np.where(a == [0.8,0.7,0.7]) 
(array([1]), array([1])) 

2番目の結果もわかりません。誰かがそれを私に説明してもらえますか?ありがとう。

+1

'np.where((a == 0.3)|(a == 0.5))'と 'np.where((a == 0.7)|(a == 0.8))'を使用して正しい結果を得る。しかし、 'np.where(a == [0.7,0.8])'が 'DeprecationWarning'を投げている間に' np.where(a == [0.7、0.7、0.8]) 'が働く理由を知りません。バグのように見えます。 – Khris

+1

'where'が予期しないインデックスを与えるとき、条件配列を見てください。 'where'はその配列が' True'であるところを伝えています。 – hpaulj

答えて

1

まず、np.where(a == [whatever])は、a == [whatever]がTrueのインデックスを表示しています。したがって、a == [whatever]の値を見ることでヒントを得ることができます。あなたのケースでは、 "作品":

>>> a == [0.7, 0.7, 0.8] 
array([[False, False, False], 
     [False, True, False], 
     [False, False, False], 
     [False, False, True], 
     [ True, False, False]], dtype=bool) 

あなたはあなたがあなたの考えを得ることはありません。あなたはそれが別々に各要素のインデックスを要求していると思うが、行の同じ位置に値が一致する位置を取得しています。基本的には、この比較では、「各行について、最初の要素が0.7かどうか、2番目の要素が0.7かどうか、3番目の要素が0.8かどうかを教えてください。次に、一致する位置のインデックスを返します。つまり、個々の値だけでなく、行全体の比較が行われます。あなたの最後の例:

>>> a == [0.8,0.7,0.7] 
array([[False, False, False], 
     [False, True, False], 
     [False, False, False], 
     [False, False, False], 
     [False, False, False]], dtype=bool) 

これで異なる結果になりました。 "aの値が0.8のインデックス"を求めていないので、行の先頭に0.8 があるインデックスのみを求めています。 - 同様に後の2つのポジションのいずれかに0.7があります。

このタイプの行比較は、比較する値がaという単一の行の形状と一致する場合にのみ実行できます。したがって、2要素のリストで試してみると、配列内の個々の値に対してスカラー値としてリストを比較しようとしているので、空のセットを返します。

結論として、値のリストに==を使用することはできず、値がどこにあるのかを伝えることができます。等価は値と位置(配列の行と同じ形状の場合)と一致します。またはリスト全体をスカラとして比較しようとします(形状が一致しない場合) 。あなたが独立して値を検索したい場合は、Khrisコメントで示唆するもののような何かをする必要があります。

np.where((a==0.3)|(a==0.5)) 

つまり、あなたは、別々の値に対して2つ(またはそれ以上)の別々の比較を行うために必要はありません値のリストに対する単一の比較。

+0

うわー、そうだった。 Pythonはスマートで奇妙です:) –

関連する問題