Genau wie Python, daß [::-1]
das Array gibt wieder umkehrt, indem argsort()
und [:n]
, dass im letzten n Elemente:
>>> avgDists=np.array([1, 8, 6, 9, 4])
>>> n=3
>>> ids = avgDists.argsort()[::-1][:n]
>>> ids
array([3, 1, 2])
Der Vorteil dieser Methode ist, dass ids
a view von avgDists ist:
>>> ids.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
(Die Angabe 'OWNDATA' ist falsch, dies ist eine Ansicht, keine Kopie)
Ein anderer Weg, dies zu tun, ist so etwas wie:
(-avgDists).argsort()[:n]
Das Problem ist, dass die Art und Weise das funktioniert jedes Element im Array negativ zu erstellen ist:
>>> (-avgDists)
array([-1, -8, -6, -9, -4])
und erstellt eine Kopie, dies zu tun :
>>> (-avgDists_n).flags['OWNDATA']
True
Also jeder, wenn Sie Zeit, auch bei dieser sehr kleinen Datensatz:
>>> import timeit
>>> timeit.timeit('(-avgDists).argsort()[:3]', setup="from __main__ import avgDists")
4.2879798610229045
>>> timeit.timeit('avgDists.argsort()[::-1][:3]', setup="from __main__ import avgDists")
2.8372560259886086
Die Ansicht Verfahren ist wesentlich schneller
Ist es nicht einfach 'ids = np.array (avgDists) .argsort() [- n:]'? – Jaime
@Jaime: Nein, das funktioniert nicht. "Richtige Antwort" ist "[3, 1, 2]". Deine Zeile produziert '[2, 1, 3]' (wenn n == 3 als Beispiel) – dawg
@drewk Nun, dann mach ''ids = np.array (avgDists) .argsort() [- n:] [: : -1] '. Die Sache ist, eine Kopie der ganzen Liste zu vermeiden, die man erhält, wenn man davor ein '-' hinzufügt. Nicht relevant für das kleine Beispiel des OP könnte für größere Fälle sein. – Jaime