2013-11-21 73 views
5

我有N維矩陣,其中包含具有N個參數的函數的值。每個參數都有一個離散數值。我需要在所有參數中最大化函數,而不是一個,導致尺寸的一維向量等於非最大化參數值的數量。我還需要保存其他參數取得的值。獲取軸上numpy.argmax元素的索引

要做到這一點,我想迭代地在不同軸上應用numpy.max來降低矩陣的維數以找到我需要的。最終的向量將取決於我忽略的參數。

但是我很難找到最終元素的原始索引(其中包含有關其他參數所取值的信息)。我雖然關於使用numpy.argmax的方式與numpy.max相同,但我無法取回原始索引。

的是我想要的一個例子是:

x = [[[1,2],[0,1]],[[3,4],[6,7]]] 
args = np.argmax(x, 0) 

這將返回

[[1 1] 
[1 1]] 

這意味着argmax是選擇原中的元素(2,1,4,7)矩陣。但如何獲得他們的指數?我嘗試unravel_index,直接使用args作爲索引矩陣x,從numpy到索引的一堆函數沒有成功。

使用numpy.where不是一個解決方案,因爲輸入矩陣內部可能有相同的值,所以我不能從不同的原始值中辨別出來。

回答

6

x.argmax(0)給出最大值沿第1軸的指標。使用np.indices來生成另一個軸的索引。

x = np.array([[[1,2],[0,1]],[[3,4],[6,7]]]) 
x.argmax(0) 
    array([[1, 1], 
      [1, 1]]) 
a1, a2 = np.indices((2,2)) 
(x.argmax(0),a1,a2) 
    (array([[1, 1], 
      [1, 1]]), 
    array([[0, 0], 
      [1, 1]]), 
    array([[0, 1], 
      [0, 1]])) 


x[x.argmax(0),a1,a2] 
    array([[3, 4], 
      [6, 7]]) 

x[a1,x.argmax(1),a2] 
    array([[1, 2], 
      [6, 7]]) 

x[a1,a2,x.argmax(2)] 
    array([[2, 1], 
      [4, 7]]) 

如果x具有其它尺寸,生成a1,和a2適當。

官方文檔沒有多說如何使用argmax,但早期的SO線程已經討論過它。我從Using numpy.argmax() on multidimensional arrays

得到了這個總體想法