Broadcast 1D-Array gegen 2D-Array für Lexsort: Permutation für das Sortieren jeder Spalte unabhängig, wenn ein weiterer Vektor berücksichtigt wird

9

Betrachten Sie das Array a

%Vor%

Ich kann b erstellen, das die Permutation enthält, um jede Spalte zu sortieren.

%Vor%

Ich kann a mit b

sortieren %Vor%

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.

%Vor%

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?

    
piRSquared 25.05.2017, 22:16
quelle

2 Antworten

3

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 -

%Vor%

Wenn wir dies also in unsere vorgeschlagene Methode einbeziehen und die Erzeugung von g_idx2D optimieren, hätten wir eine formale Funktion wie diese -

%Vor%

Laufzeittest

Ursprünglicher Ansatz:

%Vor%

Zeiten -

%Vor%     
Divakar 25.05.2017, 22:45
quelle
1

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.

%Vor%

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.

%Vor%

Angenommen, mein erstes Konzept ist lexsort1

%Vor% %Vor%

Nochmals vielen Dank @Divakar. Bitte upvote seine Antwort !!!

    
piRSquared 26.05.2017 06:14
quelle