2017-07-07 1 views
1

から取られる:変更順序np.argmaxインデックスは私のような3つのマトリックス持っ

stacked = np.dstack([one, two, three]) 

、最終的には、最大値でインデックスを決定します:

one = np.empty((5,5)) 
one[:] = 10 

two = np.empty((5,5)) 
two[:] = 10 

three = np.empty((5,5)) 
three[:] = 2 

を、私は、それらを積み重ねます

t_max = np.argmax(stacked, axis=2) 

ここでは最大値を決定したいが、注意が必要です。同一の最大値を持つ深度が複数ある場合(私の例のように)、最大の深度からインデックスを返したいと思います。

[[0 0 0 0 0] 
[0 0 0 0 0] 
[0 0 0 0 0] 
[0 0 0 0 0] 
[0 0 0 0 0]] 

私は戻りたい:

[[1 1 1 1 1] 
[1 1 1 1 1] 
[1 1 1 1 1] 
[1 1 1 1 1] 
[1 1 1 1 1]] 

第2の深さは、最初と同一の最大値を有するが、のようにより大きな深さを有しているので、それは今t_max戻るよう

よく

EDIT:

私はちょうど最初np.flip(stacked, axis=2)を行うことができると思いますが、多分これは最善の方法ではありません。効率の目的のため

答えて

1

、Iはflippedビューを使用して示唆した後、これと同様に、最後の軸の長さから減算した後のインデックスを取得することになる -

stacked.shape[-1] - stacked[...,::-1].argmax(-1) - 1 

別のアプローチを一つ反転ビットより長いことなく、あろう

(stacked == stacked.max(-1,keepdims=1)).cumsum(-1).argmax(-1) 

サンプル実行 - -

そうのように、これらの試合の最後のものをキャッチするために argmaxを使用して、最大値との比較で、累積合計を使用して、
In [29]: stacked = np.random.randint(0,3,(2,5,3)) 

In [30]: stacked 
Out[30]: 
array([[[2, 1, 2], 
     [1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 0], 
     [1, 2, 2]], 

     [[2, 1, 1], 
     [1, 1, 1], 
     [1, 2, 2], 
     [1, 1, 0], 
     [1, 0, 0]]]) 

In [31]: stacked.shape[-1] - stacked[...,::-1].argmax(-1) - 1 
Out[31]: 
array([[2, 2, 2, 1, 2], 
     [0, 2, 2, 1, 0]]) 

In [32]: (stacked == stacked.max(-1,keepdims=1)).cumsum(-1).argmax(-1) 
Out[32]: 
array([[2, 2, 2, 1, 2], 
     [0, 2, 2, 1, 0]]) 

ランタイムテスト -

In [33]: stacked = np.random.randint(0,10,(1000,1000,100)) 

In [34]: %timeit stacked.shape[-1] - stacked[...,::-1].argmax(-1) - 1 
1 loop, best of 3: 281 ms per loop 

In [35]: %timeit (stacked == stacked.max(-1,keepdims=1)).cumsum(-1).argmax(-1) 
1 loop, best of 3: 659 ms per loop 
関連する問題