2014-11-24 64 views
0

比方說有一個numpy的陣列類似如下:通過numpy數組中的值獲取前k個數字的索引?

import numpy as np 
a = array([[1,2,3],[4,3,1]]) 

而且要返回前3個數字。你可以找到最大:

i,j = np.unravel_index(a.argmax(), a.shape) 

但對於第二和第三頂值的索引,你怎麼能找到這些?我能想到的唯一選擇是爲存儲在最大索引處的值設置0,然後再次運行該過程。必須有更好的方法嗎?

,有如下的答案是:(1,0),(0,2),(1,1)

回答

2

如果你通過了axis=None參數argsort,它返回的扁平陣列的分類索引(按升序排列)。 numpy.unravel_index函數將平展數組的索引轉換爲給定形狀的數組的索引。

>> a = np.array([[1,2,3],[4,3,1]]) 
>> np.unravel_index(a.argsort(axis=None), dims=a.shape) 
    (array([0, 1, 0, 0, 1, 1], dtype=int64), 
    array([0, 2, 1, 2, 1, 0], dtype=int64)) 

unravel_index結果是陣列,其中每個陣列是沿着每個相應的軸的索引的元組。要配對指數爲座標,我們可以使用zip

>> ix = np.unravel_index(a.argsort(axis=None), dims=a.shape) 
>> zip(*ix)[-3:] 
    [(0, 2), (1, 1), (1, 0)] 

這是再次按升序排列。我們可以用一個負面的步伐來以降序排列。

>> zip(*ix)[:2:-1] 
    [(1, 0), (1, 1), (0, 2)] 

這裏的整個事情在同一行,其中n是「頂」座標你想要的號碼。

>> zip(*np.unravel_index(a.argsort(axis=None), dims=a.shape))[::-1][:n] 
0

你需要你的平板陣列的第一,然後進行排序,並使用unique從拒絕重複輸入。

>>> a.flatten() 
array([1, 2, 3, 4, 3, 1]) 
>>> b=a.flatten() 
>>> np.unique(np.sort(b))[-3:] 
array([2, 3, 4]) 

和獲得指標,你可以使用argsort

>>> b.argsort()[-3:] 
array([2, 4, 3]) 
+0

這會給我的價值,但我怎麼得到那些價值指數呢? – user1835351 2014-11-24 04:08:18

+0

@ user1835351我更新了答案 – Kasramvd 2014-11-24 04:14:08

相關問題