Numpy-Array Sortieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

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']]
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

na klar
aber ich sehe nur Sortierungen des kompletten Arrays, oder habe ich etwas übersehen?
deets

"axis along which to sort" zB? Ist doch sogar nen Beispiel dabei.
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

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']]
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')
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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).
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

Das mit dem Index war eine gute Idee und genau was ich suchte
Danke.
Antworten