Kann die numpy argpartition-Ausgabe nicht verstehen

8

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

%Vor%

Aber wenn ich indices_sorted = np.argpartition(norms, 5)[:5]

verwende %Vor%

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]

verwende %Vor%

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.

    
rookie 12.02.2017, 05:27
quelle

2 Antworten

11

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 -

%Vor%

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!

    
Divakar 12.02.2017, 08:33
quelle
2

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 :

%Vor%

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

    
Paul Panzer 12.02.2017 10:16
quelle

Tags und Links