Betrachten Sie eine Reihe von Zahlen:
%Vor% Nun möchte ich diese Menge in eine andere Menge y
auf folgende Weise transformieren: für jedes Element i
in x
wäre das entsprechende Element j
in y
die Anzahl der anderen Elemente in x
, die kleiner als i
sind. Zum Beispiel würde das oben angegebene x
wie folgt aussehen:
Jetzt kann ich das mit einfachen Python-Schleifen machen:
%Vor% Wenn jedoch die Länge von x
sehr groß ist, wird der Code extrem langsam. Ich habe mich gefragt, ob irgendeine nautische Magie zur Rettung gebracht werden kann. Wenn ich zum Beispiel alle Elemente kleiner als 0.5
filtern müsste, hätte ich einfach eine boolesche Maskierung verwendet:
Kann so etwas verwendet werden, damit dasselbe viel schneller erreicht werden kann?
Was Sie eigentlich tun müssen, ist das inverse der Sortierreihenfolge Ihres Arrays:
%Vor%Beispiel run (in ipython):
%Vor% Alternativ, wenn Sie die Anzahl der Elemente größer als jedes entsprechende Element in x
erhalten möchten, müssen Sie die Sortierung von aufsteigend zu absteigend umkehren. Eine mögliche Option ist, einfach die Konstruktion der Indizierung zu vertauschen:
ein anderer, wie @unutbu in einem Kommentar vorgeschlagen , wird das ursprüngliche Array dem neuen zugeordnet:
%Vor% Hier ist ein Ansatz mit np.searchsorted
-
Ein weiterer meist auf @Andras Deak's solution
mit argsort()
-
Beispiellauf -
%Vor% Ich wollte zu diesem Beitrag beitragen, indem ich ein paar Tests mit @Andras Deaks Lösung versus argsort
erneut vorstelle.
Es scheint, dass argsort
für kurze Arrays wieder schneller ist. Eine einfache Idee ist es, zu bewerten, wie groß die Länge der Anordnung ist, in der wir die Balance verschieben.
Ich definiere drei Funktionen
construct
ist die Lösung von Andras Deak argsortagain
was offensichtlich ist attempted_optimal
, die bei len(a) == 400
abschliesst
attempted_optimal
macht, was es tun soll. Aber ich bin mir nicht sicher, ob es sich für den marginalen Nutzen lohnt, der in einem Spektrum von Array-Länge (unter 400) gewonnen wird, wo es kaum darauf ankommt. Ich würde mich nur für constructed
einsetzen.
Diese Analyse hat mir geholfen, zu dieser Schlussfolgerung zu kommen.
Tags und Links python python-3.x numpy