2013-05-29 8 views
10

Hallo Ich habe ein Array mit X Menge an Werten Ich würde gerne die Indexe der zehn kleinsten Werte suchen. In diesem Link haben sie das Maximum effektiv berechnet, How to get indices of N maximum values in a numpy array? aber ich kann noch nicht kommentieren Links, also muss ich die Frage erneut einreichen.Ich brauche die N Minimum (Index) -Werte in einem numply Array

Ich bin nicht sicher, welche Indizes ich ändern muss, um die minimalen und nicht die maximalen Werte zu erreichen. Dies ist ihr Code

In [1]: import numpy as np 

In [2]: arr = np.array([1, 3, 2, 4, 5]) 

In [3]: arr.argsort()[-3:][::-1] 
Out[3]: array([4, 3, 1]) 

Antwort

22

Wenn Sie

arr.argsort()[:3] 

nennen Sie Sie geben die Indizes der drei kleinsten Elemente.

array([0, 2, 1], dtype=int64) 

Also, für n, sollten Sie

arr.argsort()[:n] 
5

Ich garantiere nicht nennen, dass dies schneller sein wird, aber ein besseren Algorithmus würde auf heapq verlassen.

import heapq 
indices = heapq.nsmallest(10,np.nditer(arr),key=arr.__getitem__) 

Dies sollte in etwa O(N) Operationen arbeiten während argsort mit O(NlogN) Operationen nehmen würde. Der andere wird jedoch in hoch optimiertes C geschoben, so dass es möglicherweise noch besser funktioniert. Um sicher zu sein, müssten Sie einige Tests mit Ihren tatsächlichen Daten durchführen.

+0

o ja, das funktioniert auch. Ich habe versucht, es vorher zu benutzen, aber es fehlte etwas und es wurde etwas kompliziert, aber es funktioniert jetzt dank:] – astrochris

+0

Funktioniert auch für mich. Aber in meinem Fall ist es etwa 20 mal langsamer als die reine numpy Lösung – embert

+0

Ich glaube nicht, dass es für Floats funktioniert. – darshan

2

Ändern Sie die Sortierergebnisse nicht.

In [164]: a = numpy.random.random(20) 

In [165]: a 
Out[165]: 
array([ 0.63261763, 0.01718228, 0.42679479, 0.04449562, 0.19160089, 
     0.29653725, 0.93946388, 0.39915215, 0.56751034, 0.873, 
     0.17521395, 0.49573607, 0.84587652, 0.73638224, 0.36303797, 
     0.2150837 , 0.51665416, 0.47111993, 0.79984964, 0.89231776]) 

Sortiert:

In [166]: a.argsort() 
Out[166]: 
array([ 1, 3, 10, 4, 15, 5, 9, 14, 7, 2, 17, 11, 16, 8, 0, 13, 18, 
     12, 19, 6]) 

ersten zehn:

In [168]: a.argsort()[:10] 
Out[168]: array([ 1, 3, 10, 4, 15, 5, 9, 14, 7, 2]) 
10

Da diese Frage gestellt wurde, hat numpy aktualisiert einen schnelleren Weg gehören der kleinsten Elemente aus einem Array Auswahl argpartition mit . Es wurde zuerst in Numpy 1.8 enthalten.

Mit snarly's answer als Inspiration können wir schnell die k=3 kleinsten Elemente finden:

In [1]: import numpy as np 

In [2]: arr = np.array([1, 3, 2, 4, 5]) 

In [3]: k = 3 

In [4]: ind = np.argpartition(arr, k)[:k] 

In [5]: ind 
Out[5]: array([0, 2, 1]) 

In [6]: arr[ind] 
Out[6]: array([1, 2, 3]) 

Dies wird in O läuft (n) Zeit, weil es keine vollständige Art zu tun braucht. Wenn Sie Ihre Antworten müssen sortierten (Hinweis: in diesem Fall der Ausgang Array in sortierter Reihenfolge war, aber das ist nicht garantiert) Sie die Ausgabe sortieren:

In [7]: sorted(arr[ind]) 
Out[7]: array([1, 2, 3]) 

lügen k Dies läuft auf O (n + k) weil die Sortierung auf der kleineren Ausgabeliste erfolgt.

Verwandte Themen