2015-10-17 94 views
5

有很多解決方案,爲單個陣列做到這一點的,但對於一個矩陣,如:最快的方式

>>> k 
array([[ 35, 48, 63], 
     [ 60, 77, 96], 
     [ 91, 112, 135]]) 

您可以使用k.max(),但當然這隻返回最高值,135。如果我想要第二或第三呢?

+2

看看這個答案:http://stackoverflow.com/questions/26603747/get-the-indices-of-n-highest-values-in-an-ndarray – NJM

回答

8

可以flatten矩陣,然後對其進行排序:

>>> k = np.array([[ 35, 48, 63], 
...  [ 60, 77, 96], 
...  [ 91, 112, 135]]) 
>>> flat=k.flatten() 
>>> flat.sort() 
>>> flat 
array([ 35, 48, 60, 63, 77, 91, 96, 112, 135]) 
>>> flat[-2] 
112 
>>> flat[-3] 
96 
+4

'np.partition'可能會更快 - 它進行了部分排序,只是將數組分成兩部分。 – hpaulj

+0

哦,我喜歡那樣。 – rofls

+0

這種方法可能會更好,如果他想抓住多個元素,比如說第二,第三大等等,因爲除索引之外,它們都將不再進行其他操作。 – rofls

6

由於saidnp.partition應該更快(最多O(n)的運行時間):

np.partition(k.flatten(), -2)[-2] 

應該返回第二最大的元素。 (partition保證編號元素在位,前面的所有元素都較小,後面的所有元素都較大)。

0
import numpy as np 
a=np.array([[1,2,3],[4,5,6]]) 
a=a.reshape((a.shape[0])*(a.shape[1])) # n is the nth largest taken by us 
print(a[np.argsort()[-n]]) 
+2

感謝您的貢獻。如果你解釋你的想法,你的答案可能會更有用。 –