2016-01-19 6 views
10
two_d = np.array([[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19], 
        [20, 21, 22, 23, 24]]) 

first = np.array((True, True, False, False, False)) 
second = np.array((False, False, False, True, True)) 

での2D np.arrayのインデックス作成時:予期しない動作、私が入力したとき、今すぐ2つのブール配列

two_d[first, second] 

私が手:

全体の多くを作成しません
array([3,9]) 

私には意味がありません。誰でも簡単に説明できますか?

答えて

8

インデックスを付けるブール値の配列が複数ある場合、NumPyはTrue値のインデックスをペアにします。最初の真値はfirstで、最初の真値はsecondになります。 NumPyは、これらの(x、y)インデックスのそれぞれの要素を取得します。

これはtwo_d[first, second]と等価であることを意味します。あなたは、インデックス(0、3)及びインデックス(1、4)で値を取得している言い換えれば

two_d[[0, 1], [3, 4]] 

3および9。 2つの配列の値が異なる場合、エラーが発生することに注意してください。

documents on advanced indexing言及簡単にこの動作と「あまり驚くべき」代替としてnp.ix_をお勧め:整数のインデックス配列で複数のブールインデックス配列またはブールを組み合わせる

は最高obj.nonzero()類推して理解することができます。関数ix_はブール型配列もサポートしており、驚きなく動作します。

したがって、あなたが探していることがあります。

>>> two_d[np.ix_(first, second)] 
array([[3, 4], 
     [8, 9]]) 
+0

私はあなたが取得したいと仮定ものを得るためには、[最初] .T [二] .T – pixelbrei

+0

@pixelbrei two_dを使用することができます。ドキュメントはに 'np.ix_'を使用して示唆しているがはいているが、ここで仕事ができます希望の結果を得る。 –

+0

@ajcr素晴らしい、ありがとう! – user3763302

1

documentation on boolean indexingを確認してください。

two_d[first, second]


two_d[first.nonzero(), second.nonzero()]、同じである:これは3を選択する

>>> first.nonzero() 
(array([0, 1]),) 
>>> second.nonzero() 
(array([3, 4]),) 

が指標として使用され、9

>>> two_d[0,3] 
3 
>>> two_d[1,4] 
9 

また
>>> two_d[[0,1],[3,4]] 
array([3, 9]) 

mildy関連ため:NumPy indexing using List?

関連する問題