HILFE! -> Sortieren in Python (od. Numpy)

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
E1986
User
Beiträge: 19
Registriert: Samstag 3. Mai 2014, 17:43

Hi.
Ich habe folgendes Problem und bekomme es einfach nicht auf die Reihe.

Ich möchte das Problem am besten mit NUMPY lösen.
("normale" Pythonlösungen gehen aber auch)

Hab eine csv-Datei und somit einen Input in Python von:

[['XX' '1' '2' '3' '4']
['YY' '148.18' '126.57' '121.19' '132.53']
['1' '85' '25' '0' '0']
['2' '85' '25' '0' '0']
['3' '85' '25' '0' '0']
['4' '85' '25' '320' '680']]

Ich möchte jetzt diese Daten nach den Werten der 2 Zeile ['YY' '125.18' '126.57' '128.19' '132.53']) aufsteigent sortieren.
Aber ebend so, dass die dazugehörigen Werte in den Spalten "mitwandern".

Also so (Output):

[['XX' '3' '2' '4' '1']
['YY' '121.19' '126.57' '132.53' '148.18']
['1' '0' '25' '0' '85']
['2' '0' '25' '0' '85']
['3' '0' '25' '0' '85']
['4' '320' '25' '680' '85']]

Könnt ihr mir da vielleicht bitte weiterhelfen?

Vielen Dank.
BlackJack

@E1986: Wie sind denn die Daten in dieses komische Format gekommen? Ist das ein `numpy`-Array mit Zeichenketten? Das ist ja zum Beispiel schon mal schlecht nach Zahlenwerten zu sortieren, weil man dafür Zahlen bräuchte. Könntest Du das eventuell auch ohne die erste Spalte einlesen? Dann kannst Du mit `numpy.argsort()` die Indizes für ein entsprechend sortiertes Array ermitteln.

Edit:

Code: Alles auswählen

In [39]: !cat test.csv
XX,1,2,3,4
YY,148.18,126.57,121.19,132.53
1,85,25,0,0
2,85,25,0,0
3,85,25,0,0
4,85,25,320,680

In [40]: np.genfromtxt('test.csv', delimiter=',')
Out[40]: 
array([[    nan,    1.  ,    2.  ,    3.  ,    4.  ],
       [    nan,  148.18,  126.57,  121.19,  132.53],
       [   1.  ,   85.  ,   25.  ,    0.  ,    0.  ],
       [   2.  ,   85.  ,   25.  ,    0.  ,    0.  ],
       [   3.  ,   85.  ,   25.  ,    0.  ,    0.  ],
       [   4.  ,   85.  ,   25.  ,  320.  ,  680.  ]])

In [41]: np.genfromtxt('test.csv', delimiter=',')[:, 1:]
Out[41]: 
array([[   1.  ,    2.  ,    3.  ,    4.  ],
       [ 148.18,  126.57,  121.19,  132.53],
       [  85.  ,   25.  ,    0.  ,    0.  ],
       [  85.  ,   25.  ,    0.  ,    0.  ],
       [  85.  ,   25.  ,    0.  ,    0.  ],
       [  85.  ,   25.  ,  320.  ,  680.  ]])

In [42]: data = np.genfromtxt('test.csv', delimiter=',')[:, 1:]

In [43]: data[1]
Out[43]: array([ 148.18,  126.57,  121.19,  132.53])

In [44]: data[1].argsort()
Out[44]: array([2, 1, 3, 0])

In [45]: idx = data[1].argsort()

In [46]: data[:, idx]
Out[46]: 
array([[   3.  ,    2.  ,    4.  ,    1.  ],
       [ 121.19,  126.57,  132.53,  148.18],
       [   0.  ,   25.  ,    0.  ,   85.  ],
       [   0.  ,   25.  ,    0.  ,   85.  ],
       [   0.  ,   25.  ,    0.  ,   85.  ],
       [ 320.  ,   25.  ,  680.  ,   85.  ]])
E1986
User
Beiträge: 19
Registriert: Samstag 3. Mai 2014, 17:43

@BlackJack:
Vielen vielen Dank für deine Antwort. Die Daten stammen aus einer kompletten Tabelle mit Tabellenkopf und Tabellenrand.
Ich habe es mit `numpy.argsort()` auch schon versucht. Aber hab es nicht hinbekommen.

Die erste Spalte kann ich rausnehmen und dann werd ichs mal so versuchen, wie du es gezeigt hast. DANKE!
E1986
User
Beiträge: 19
Registriert: Samstag 3. Mai 2014, 17:43

Ich habe jetzt die Datei ohne die erste Spalte eingelesen.

Es geht jetzt also noch um Folgendes ab line 27 (bei BlackJack).
(ich hab jetzt also den Input wie bei BlackJack 20-25 zu sehen.

Könnte mir bitte jemand, bzw. BlackJack nochmal kurz und knapp Schritt für Schritt erklären, was von line 27 bis line 37 passiert?

Line 27: warum muss man das nochmal machen? Die „richtige“ Output ist doch schon da (l20-25)
Line 29/30 ist klar, spuckt zweite Zeile aus
Line 32 versteh ich so, dass ich das Zeug aus 30 argsorte
Line 33 versteh ich nicht! Wo kommt das her? Da hab ich doch 148.18, 126.57, usw.?!
Line 35 ist klar, WENN Line 33 okay ist
Line 37: gibt er aus „IndexError: too many indices“

Kann mir jemand da bitte weiterhelfen?! (od.. BlackJack?)
BlackJack

@E1986: Line 27: Was meinst Du mit „noch mal machen”? Davor habe ich die Datei geladen und das Ergebnis wurde direkt angezeigt, und in Zeile 27 lade ich die Datei und binde das Ergebnis an den Namen `data`. Da hätte ich natürlich auch ``data = _`` in der Python-Shell schreiben können, oder ``data = _40``, weil es IPython ist, oder statt im Folgenden `data` zu verwenden immer auf `_40` zugreifen können.

Zeile 33 ist das Ergenis des `argsort()`. Das sind die *Indizes* in der Reihenfolge wie man ``data[1]`` auslesen muss damit es sortiert wäre. So ist `argsort()` definiert.

Zeile 37: Das kann nicht sein. Das alles ist doch eine 1:1 Kopie einer IPython-Session. Wenn da ein `IndexError` kommt, dann passen `data` und `idx` nicht zusammen. So wie `idx` aus einer Zeile von `data` berechnet wurde, müssen die aber zusammenpassen.
E1986
User
Beiträge: 19
Registriert: Samstag 3. Mai 2014, 17:43

Vielen Dank für deine Ausführungen. Ich werde es nochmal probieren. Bei mir schaut es alles etwas anders aus, weil ich den gesamten Code in einem extra Feld eingebe und dann nur über die Shell/Idle ausführen lasse.
Antworten