Ich versuche, argppartition von numpy zu verwenden, aber es scheint, dass da etwas schief läuft und ich es scheinbar nicht herausfinden kann. Hier ist was passiert:
Dies sind die ersten 5 Elemente des sortierten Arrays norms
Aber wenn ich indices_sorted = np.argpartition(norms, 5)[:5]
Wenn ich denke, ich sollte das gleiche Ergebnis wie das sortierte Array bekommen?
Es funktioniert gut, wenn ich 3 als Parameter indices_sorted = np.argpartition(norms, 3)[:3]
Das macht mir nicht viel Sinn, in der Hoffnung, dass jemand einen Einblick geben kann?
EDIT: Das Umformulieren dieser Frage als ob die Argpartition die Ordnung der k partitionierten Elemente wahrt, macht mehr Sinn.
Wir müssen eine Liste von Indizes verwenden, die in einer sortierten Reihenfolge zu halten sind, anstatt den k-ten Parameter als Skalar einzugeben. Um also die sortierte Natur über die ersten 5
Elemente statt np.argpartition(a,5)[:5]
zu erhalten, tun Sie einfach -
Hier ist ein Beispiellauf, um die Dinge zu verdeutlichen -
%Vor% Bitte beachten Sie, dass argpartition
im Hinblick auf den Leistungsaspekt sinnvoll ist, wenn wir nach sortierten Indizes für eine kleine Teilmenge von Elementen suchen, sagen wir k
Anzahl der Elemente, was ein kleiner Bruchteil der Gesamtzahl der Elemente ist.
Lassen Sie uns einen größeren Datensatz verwenden und versuchen, sortierte Indizes für alle Elemente zu erhalten, um den oben genannten Punkt klar zu machen -
%Vor% Um alle Elemente zu sortieren, ist np.argpartition
also nicht der richtige Weg.
Nun, sagen wir, ich möchte Indizes für nur die ersten 5 Elemente mit diesem großen Datensatz erhalten und auch die Reihenfolge für diese beibehalten -
%Vor%Sehr nützlich hier!
Angesichts der Aufgabe, eine Teilmenge (die oberste k , oberste Bedeutung zuerst in der Sortierreihenfolge) zu sortieren, gibt es zwei eingebaute Lösungen: argsort
und argpartition
cf. @ Divakar die Antwort.
Wenn jedoch die Leistung eine Rolle spielt, dann kann es (abhängig von der Größe der Daten und der Untermenge von Interesse) gut sein, der "Verlockung des Einzeilers" zu widerstehen, eine weitere Zeile zu investieren und% co_de anzuwenden % auf der Ausgabe von argsort
:
argpartition
ist O (n log n), argsort
mit Bereichsargument scheint O (nk) (?) zu sein, und argpartition
+ argpartition
ist O (n + k log k)
Daher in einem interessanten Regime n & gt; & gt; k & gt; & gt; 1 wird erwartet, dass die Hybridmethode am schnellsten ist