Seite 1 von 1

Numpy-Array Sortieren

Verfasst: Montag 22. August 2011, 02:38
von smith0815
Hi

Kann ich ein Numpy-Array

Code: Alles auswählen

[['Mayer', 'Frank', 'Berlin'],
 ['Bayer', 'Peter, 'Frankfurt'],
 ['Geyer', 'Rita', 'Jülich']]
nur nach einer Spalte, so dass aber die Verbindung in der Zeile erhalten bleibt

Code: Alles auswählen

[['Bayer', 'Peter, 'Frankfurt'],
 ['Geyer', 'Rita', 'Jülich'],
 ['Mayer', 'Frank', 'Berlin']]

Re: Numpy-Array Sortieren

Verfasst: Montag 22. August 2011, 06:59
von CM

Re: Numpy-Array Sortieren

Verfasst: Montag 22. August 2011, 21:35
von smith0815
na klar
aber ich sehe nur Sortierungen des kompletten Arrays, oder habe ich etwas übersehen?

Re: Numpy-Array Sortieren

Verfasst: Montag 22. August 2011, 21:50
von deets
"axis along which to sort" zB? Ist doch sogar nen Beispiel dabei.

Re: Numpy-Array Sortieren

Verfasst: Dienstag 23. August 2011, 08:30
von smith0815
Es geht mir aber nicht darum entlang einer Achse zu sortieren, sondern entlang einer Spalte, also

Code: Alles auswählen

[['Mayer', 'Frank', 'Berlin'],
['Bayer', 'Peter, 'Frankfurt'],
['Geyer', 'Rita', 'Jülich']]
nach Spalte 0

Code: Alles auswählen

[['Bayer', 'Peter, 'Frankfurt'],
['Geyer', 'Rita', 'Jülich'],
['Mayer', 'Frank', 'Berlin']]
nach Spalte 3

Code: Alles auswählen

[['Mayer', 'Frank', 'Berlin'],
['Bayer', 'Peter, 'Frankfurt'],
['Geyer', 'Rita', 'Jülich']]

Re: Numpy-Array Sortieren

Verfasst: Dienstag 23. August 2011, 09:11
von BlackJack
@smith0815: Wäre `argsort()` auf der Spalte und das Ergebnis dann als Index auf dem gesamten Array verwenden eine Lösung?

Edit:

Code: Alles auswählen

In [43]: a
Out[43]: 
array([['Mayer', 'Frank', 'Berlin'],
       ['Bayer', 'Peter', 'Frankfurt'],
       ['Geyer', 'Rita', 'J\xc3\xbclich']], 
      dtype='|S9')

In [44]: a[np.argsort(a[:,0])]
Out[44]: 
array([['Bayer', 'Peter', 'Frankfurt'],
       ['Geyer', 'Rita', 'J\xc3\xbclich'],
       ['Mayer', 'Frank', 'Berlin']], 
      dtype='|S9')

In [45]: a[np.argsort(a[:,2])]
Out[45]: 
array([['Mayer', 'Frank', 'Berlin'],
       ['Bayer', 'Peter', 'Frankfurt'],
       ['Geyer', 'Rita', 'J\xc3\xbclich']], 
      dtype='|S9')

Re: Numpy-Array Sortieren

Verfasst: Dienstag 23. August 2011, 09:52
von CM
Also, mein Verweis auf np.sort kommt eher daher, daß ich nicht davon ausgegangen bin die Spalten numerisch anzusprechen, wo es doch eher um ein structured array geht. In dem Fall geht nämlich - analog zum verlinkten Beispiel:

Code: Alles auswählen

In [46]: a
Out[46]: 
array([('Mayer', 'Frank', 'Berlin'), ('Bayer', 'Peter', 'Frankfurt'),
       ('Geyer', 'Rita', 'J\xc3\xbclich')], 
      dtype=[('name', '|S9'), ('first', '|S9'), ('city', '|S9')])

In [47]: np.sort(a, order = 'city')
Out[47]: 
array([('Mayer', 'Frank', 'Berlin'), ('Bayer', 'Peter', 'Frankfurt'),
       ('Geyer', 'Rita', 'J\xc3\xbclich')], 
      dtype=[('name', '|S9'), ('first', '|S9'), ('city', '|S9')])
Aber da ist natürlich nicht nur ein syntaktischer, sondern vor allem ein semantischer Unterschied. Die Frage ist halt, wie Du, smith0815, am liebsten Deine Daten auffassen willst.

HTH
Christian

PS Die Typen habe ich jetzt einfach mal so gesetzt, in der Realität sollte man für wirklich effizientes Sortieren etwas mehr Feintuning betreiben und fürs Lesen aus Files ist u. U. PyTables zu empfehlen.

PPS Mehr zu Structured Arrays gibt es hier (auch auf den Fuß der Seiten achten, wegen des Links zu RecArrays).

Re: Numpy-Array Sortieren

Verfasst: Donnerstag 25. August 2011, 22:15
von smith0815
Das mit dem Index war eine gute Idee und genau was ich suchte
Danke.