2017-07-07 28 views
1

採取我有三個矩陣爲這樣:更改順序np.argmax索引是從

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

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

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

我然後將它們堆疊:

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

,最後確定與所述最大值的索引:

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

我現在想確定最大值,但有一個警告。如果有多個具有相同最大值的深度(如我的示例),我想從最大深度返回索引。

由於它現在是t_max回報:

[[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]] 

由於第二深度具有相同的最大值作爲第一,但具有較大的深度爲好。

編輯:

我想我可以做np.flip(stacked, axis=2)第一,但也許這是不是最好的方法。

回答

1

出於效率的目的,我建議使用flipped視圖,然後從最後一個軸長度減去後得到的指數,像這樣 -

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

沒有翻轉,有點較長的另一種方法,是與反對的最大值相比較,採用累積相加,然後使用argmax趕上那些比賽的最後的,就像這樣 -

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

採樣運行 -

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