2016-07-09 11 views
2

Ich habe eine große 2d-Array mit Hunderten von Spalten. Ich möchte es lexikografisch sortieren, d. H. Nach erster Spalte, dann nach zweiter Spalte usw. bis zur letzten Spalte. Ich denke, das sollte einfach sein, aber ich war nicht in der Lage, einen schnellen Weg zu finden, dies zu tun.sortieren 2d numpy Array lexikografisch

Antwort

4

Dies ist, was numpy.lexsort ist, aber die Schnittstelle ist peinlich. Direkt ein 2D-Array, und es wird die Spalten, Sortierung durch die letzten Reihe zuerst, dann die zweite zu letzten Zeile argsort, weiterhin auf die erste Zeile nach oben:

>>> x 
array([[0, 0, 0, 2, 3], 
     [2, 3, 2, 3, 2], 
     [3, 1, 3, 0, 0], 
     [3, 1, 1, 3, 1]]) 
>>> numpy.lexsort(x) 
array([4, 1, 2, 3, 0], dtype=int64) 

Wenn Sie möchten, durch die Zeilen, mit der ersten Spalte als Primärschlüssel zu sortieren, müssen Sie das Array vor lexsort ing um es zu drehen:

>>> x[numpy.lexsort(numpy.rot90(x))] 
array([[0, 0, 0, 2, 3], 
     [2, 3, 2, 3, 2], 
     [3, 1, 1, 3, 1], 
     [3, 1, 3, 0, 0]]) 
+0

Großer dies scheint zu funktionieren! Also muss ich in dieser Suche eine Suche machen, aber ich weiß nicht wie. Bei einem 1d-Array möchte ich herausfinden, ob es sich um eine der sortierten Zeilen des 2d-Arrays handelt. Irgendwelche Vorschläge würden geschätzt werden. – grigor

+0

@grigor: vielleicht * [alle (row == t) für row in x] * – user66081