2017-06-07 7 views
1

3D ndarrayの特定の軸(0)に沿った最大値のインデックスを見つけようとしています。これらのインデックスを使用してこれらの値をスライスします第2の並列アレイからの対応する値)を含む。例えば、ndarrayの軸に沿って最大値を抽出するスライシング

> a = np.random.randint(10, 100, 24).reshape(2, 3, 4) 
> print(a) 
array([[[94, 22, 96, 44], 
     [11, 85, 39, 85], 
     [58, 43, 48, 84]], 

     [[84, 58, 51, 30], 
     [74, 89, 90, 11], 
     [90, 54, 94, 20]]]) 

は今、私は、すなわち

> a[inds] 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85,], 
     [90, 54, 94, 84,]]) 

ゼロ番目の軸の上に最大である値を与える指標に興味a.argmax()を使用すると、0番目の軸のインデックスがある与えます最大、すなわち

> a.argmax(axis=0) 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [1, 1, 1, 0]]) 

しかし、これは...スライスでは動作しません

答えて

1

m,n = a.shape[1:] 
Y,Z = np.ogrid[:m,:n] 
Y_max_axis0 = a[inds,Y,Z] 

サンプル実行 - -

In [15]: a 
Out[15]: 
array([[[94, 22, 96, 44], 
     [11, 85, 39, 85], 
     [58, 43, 48, 84]], 

     [[84, 58, 51, 30], 
     [74, 89, 90, 11], 
     [90, 54, 94, 20]]]) 

In [16]: inds = a.argmax(axis=0) 

In [17]: m,n = a.shape[1:] 
    ...: Y,Z = np.ogrid[:m,:n] 
    ...: Y_max_axis0 = a[inds,Y,Z] 
    ...: 

In [18]: Y_max_axis0 
Out[18]: 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85], 
     [90, 54, 94, 84]]) 

より明示的なものをレンジアレイを作成する方法と、その後のインデックス -

そうのように、軸/暗くなり、残り沿っ範囲のアレイを作成するときに advanced-indexingを使用します
In [19]: a[inds,np.arange(a.shape[1])[:,None], np.arange(a.shape[2])] 
Out[19]: 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85], 
     [90, 54, 94, 84]]) 
+0

素晴らしい感謝!私は高度なインデックス作成でブラシをかける必要があります...しかし、3番目の軸( 'np.arange(a.shape [2])')へのインデックスが追加の次元(つまり、 'np.arange(a.shape [2])[:, None]')にブロードキャストされますか? – DilithiumMatrix

+0

@DilithiumMatrix Nah、私たちはする必要はありません。そのため、 '明示的方法'のように 'np.arange(a.shape [2])'も同様に機能します。しかし、 'np.arange(a.shape [2])[None]'を持つ 'np.ogrid'(先ほど示した)のようにadditonal dimを使用すると、どちらも傷つきません。 – Divakar

+1

@DilithiumMatrix 'inds'は'(m、n) 'の淡色になります。 'np.arange(m)'は 'inds'の第1軸に沿っているので、' np.arange(m) 'は' inds'の第2軸に沿って拡張する必要があります。したがって、最初の範囲配列を拡張する必要があり、2番目の配列はインデックス作成時に 'inds'の最初の軸に沿って自動的に拡張されるため、2番目の配列は拡張しないでください。 – Divakar

関連する問題