2015-10-17 19 views
5

Es gibt viele Lösungen zu finden, das für ein einzelnes Array zu tun, aber was ist mit einer Matrix, wie zum Beispiel:Schnellster Weg, um den n-ten größten Wert einer numpy Matrix

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

Sie k.max() verwenden können, aber natürlich liefert dies nur den höchsten Wert, 135. Was ist, wenn ich das zweite oder dritte möchte?

+2

Werfen Sie einen Blick auf diese Antwort: http://stackoverflow.com/questions/26603747/get-the-indices-of-n-highest-values-in-an-ndarray – NJM

Antwort

8

Sie die Matrix flatten kann und es dann sortieren:

>>> 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' kann schneller sein - es macht eine teilweise Sortierung, gerade genug, um das Array in 2 Teile zu teilen. – hpaulj

+0

Ooh Ich mag das. – rofls

+0

Diese Methode ist möglicherweise besser, wenn Sie mehrere Elemente erfassen möchten, z. B. die 2., 3., usw., da sie alle ohne weitere Operationen verfügbar sind, mit Ausnahme der Indizierung. – rofls

6

Als said, np.partition sollte schneller sein (höchstens O (n) Laufzeit):

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

sollte die zweite Rück größtes Element. (partition garantiert, dass das nummerierte Element in Position ist, alle Elemente davor sind kleiner und alle dahinter sind größer).

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

Danke für Ihren Beitrag. Ihre Antwort könnte nützlicher sein, wenn Sie Ihr Denken erklären. –

Verwandte Themen