Betrachten Sie das Array a
Ich kann b
erstellen, das die Permutation enthält, um jede Spalte zu sortieren.
Ich kann a
mit b
Das war der Grund, um die Ausgabe zu illustrieren, die ich suche. Ich möchte ein Array b
, das die erforderliche Permutation zum Sortieren der entsprechenden Spalte in a
hat, wenn auch ein lexsort
mit einem anderen Array berücksichtigt wird.
Ich möchte ein Array b
erzeugen, wobei jede Spalte die erforderliche Permutation zu lexsort
der entsprechenden Spalte a
ist. Und das lexsort
ergibt sich aus dem Sortieren der Spalte zuerst nach den durch g
definierten Gruppen und dann nach den Werten in jeder Spalte in a
.
Ich kann die Ergebnisse mit:
erzeugen %Vor%Wir können sehen, dass das funktioniert
%Vor%und
%Vor%Frage
Gibt es eine Möglichkeit, die Verwendung des Gruppierungsarrays g
für die Verwendung in jeder Spalte " lexsort
" zu "übertragen"? Was ist ein effizienterer Weg, dies zu tun?
Hier ist ein Ansatz -
%Vor% Die Idee ist einfach, dass wir ein 2D
Gitter einer ganzzahligen Version von g
Array von Strings erstellen und dann jede Spalte um eine Schranke versetzen, die die lexsort
Suche innerhalb jeder Spalte begrenzen würde.
Nun zur Performance scheint es für große Datensätze, lexsort
selbst, der Flaschenhals zu sein. Für unser Problem haben wir nur zwei Spalten. So können wir unsere eigene benutzerdefinierte lexsort
erstellen, die die zweite Spalte basierend auf einem Offset skaliert, der die maximale Anzahl an Zahlen aus der ersten Spalte darstellt. Die Implementierung für dasselbe würde in etwa so aussehen -
Wenn wir dies also in unsere vorgeschlagene Methode einbeziehen und die Erzeugung von g_idx2D
optimieren, hätten wir eine formale Funktion wie diese -
Laufzeittest
Ursprünglicher Ansatz:
%Vor%Zeiten -
%Vor% Ich poste dies nur, um einen guten Platz zu haben, meine abgeleitete Arbeit basierend auf Divakars Antwort zu zeigen. Seine Funktion lexsort_twocols
erledigt alles, was wir brauchen, und kann genauso gut auf eine einzelne Dimension übertragen werden. Wir können auf die zusätzliche Arbeit in proposed_app
verzichten, weil wir axis=0
in argsort
in der Funktion lexsort_twocols
verwenden können.
Ich habe auch daran gedacht ... obwohl nicht annähernd so gut, weil ich immer noch auf np.lexsort
vertraue, was, wie Divakar sagte, langsam sein kann.
Angenommen, mein erstes Konzept ist lexsort1
Nochmals vielen Dank @Divakar. Bitte upvote seine Antwort !!!
Tags und Links python numpy pandas numpy-broadcasting