Wie kann ich "parallele numpy Arrays" zip sortieren?

Wenn ich zwei parallele Listen habe und sie nach der Reihenfolge der Elemente in der ersten sortieren möchte, ist es ganz einfach:

>>> a = [2, 3, 1] >>> b = [4, 6, 2] >>> a, b = zip(*sorted(zip(a,b))) >>> print a (1, 2, 3) >>> print b (2, 4, 6) 

Wie kann ich das auch mit numpy Arrays machen, ohne sie in konventionelle Python-Listen auszupacken?

  • So konfigurieren Sie die Anzeigeausgabe in IPython-Pandas
  • Algorithmus zur Erzeugung einer Baumzersetzung
  • Wie finde ich den Weg zu einer SSL-Zertifikat?
  • Wie man eine Funktion aus einer Zeichenfolge mit Python zu definieren
  • Wie man python2.7 pip anstelle von default pip benutzt
  • Teilt eine Schablone in Teile und schließt jeden Teil schlecht ein?
  • 3 Solutions collect form web for “Wie kann ich "parallele numpy Arrays" zip sortieren?”

    b[a.argsort()] sollte den Trick machen.

    So funktioniert das. Zuerst musst du eine Permutation finden, die eine. argsort ist eine Methode, die dies berechnet:

     >>> a = numpy.array([2, 3, 1]) >>> p = a.argsort() >>> p [2, 0, 1] 

    Sie können leicht überprüfen, dass dies richtig ist:

     >>> a[p] array([1, 2, 3]) 

    Jetzt die gleiche Permutation auf b anwenden.

     >>> b = numpy.array([4, 6, 2]) >>> b[p] array([2, 4, 6]) 

    Hier ist ein Ansatz, der keine Python-Listen erstellt, obwohl es ein NumPy "Record Array" benötigt, um für die Sortierung zu verwenden. Wenn Ihre beiden Eingabe-Arrays tatsächlich verwandt sind (wie Spalten in einer Tabellenkalkulation), dann könnte dies eine vorteilhafte Art und Weise des Umgangs mit Ihren Daten im Allgemeinen zu öffnen, anstatt zwei verschiedene Arrays um die ganze Zeit zu halten, in welchem ​​Fall Sie bereits haben Ein Rekord-Array und Ihr ursprüngliches Problem würde nur durch das Aufrufen von sort () auf Ihrem Array beantwortet werden.

    Dies führt eine nachträgliche Sortierung nach dem Packen beider Arrays in ein Rekord-Array:

     >>> from numpy import array, rec >>> a = array([2, 3, 1]) >>> b = array([4, 6, 2]) >>> c = rec.fromarrays([a, b]) >>> c.sort() >>> c.f1 # fromarrays adds field names beginning with f0 automatically array([2, 4, 6]) 

    Bearbeitet , um rec.fromarrays () zur Vereinfachung zu verwenden, überspringen Sie redundante dtype, verwenden Sie den Standard-Sortierschlüssel, verwenden Sie Standardfeldnamen anstelle der Angabe (basierend auf diesem Beispiel ).

    Dies könnte die einfachste und allgemeinste Art zu tun, was Sie wollen. (Ich habe hier drei Arrays verwendet, aber das wird auf Arrays jeder Form arbeiten, ob zwei Spalten oder zweihundert).

     import numpy as NP fnx = lambda : NP.random.randint(0, 10, 6) a, b, c = fnx(), fnx(), fnx() abc = NP.column_stack((a, b, c)) keys = (abc[:,0], abc[:,1]) # sort on 2nd column, resolve ties using 1st col indices = NP.lexsort(keys) # create index array ab_sorted = NP.take(abc, indices, axis=0) 

    Ein Quirk w / lexsort ist, dass du die Schlüssel in umgekehrter Reihenfolge angeben musst, dh deinen Primärschlüssel Sekunden und deinen Sekundärschlüssel zuerst setzen. In meinem Beispiel möchte ich mit der 2. Spalte als Primärschlüssel sortieren, also liste ich es zweiter; Die erste Spalte löst nur Bindungen, aber es wird zuerst aufgeführt).

    Python ist die beste Programmiersprache der Welt.