2015-10-17 11 views
5

Istnieje wiele rozwiązań, aby to zrobić na jednej tablicy, ale co z matrycy, takie jak:najszybszy sposób na znalezienie ntą największą wartość w numpy Matrix

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

Można użyć k.max(), ale oczywiście to zwraca tylko najwyższą wartość, 135. Co jeśli chcę drugi lub trzeci?

+2

Spójrz na to odpowiedź: http://stackoverflow.com/questions/26603747/get-the-indices-of-n-highest-values-in-an-ndarray – NJM

Odpowiedz

8

można flatten matrycy i układać:

>>> 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' może być szybszy - robi częściowy sort, wystarczy podzielić tablicę na dwie części. – hpaulj

+0

Ooh Podoba mi się to. – rofls

+0

Ta metoda może być lepsza, jeśli chce pobrać wiele elementów, np. Drugi, trzeci największy itd., Ponieważ wszystkie będą dostępne bez dalszych operacji poza indeksowaniem. – rofls

6

jako said, np.partition powinny być szybciej (co najwyżej O (n) z systemem)

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

należy zwrócić 2nd największy element. (partition gwarantuje, że numerowany element jest na miejscu, wszystkie elementy przed nim są mniejsze, a wszystkie z tyłu są większe).

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

Dzięki za przyczynienie się. Twoja odpowiedź może być bardziej przydatna, jeśli wyjaśnisz swoje myślenie. –

Powiązane problemy