Numpy-Array splitten nach Zeichen

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
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hallo,

ich habe eine CSV Datei die ähnlich einer Tabelle aufgebaut ist. Es gibt Zeilen und in jeder Zeile stehen mit Semikolon getrennte werte.

Wenn ich nun np.recfromcsv("filename", delimiter="/t")
benutze, bekomme ich ein Array, das so viele Elemente hat wie die CSV Zeilen. Nun steht in jedem Element alle Werte mit semikolon. Wie kann ich das erhaltene Array weiter aufsplitten?


Vielen Dank
Gruß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Was mag wohl dieser seltsame delimiter-Parameter in deinem Aufruf bedeuten... ;-)
Das Leben ist wie ein Tennisball.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hi,

in dem Aufruf

Code: Alles auswählen

np.recfromcsv("filename", delimiter="/t") 
habe ich den delimiter-Parameter schon einmal aufgerufen. Ist es möglich, in einem Aufruf mehrere delimiter anzugeben? Wenn ja - wie? Weil genau das bräuchte ich ja dann: einmal die Trennung nach Zeilen, ein zweites mal die Trennung nach semikolon

Gruß
BlackJack

@Pittan: Der `delimiter` ist für die Spalten. Für die Zeilen kannst Du keinen angeben. Was hast Du Dir bei '/t' eigentlich gedacht? Das sind *zwei* Zeichen und zwar ein Schrägstrich gefolgt von dem Buchstaben 't'. So etwas verwendet sicher niemand als Trenner. Kann es sein dass Du '\t' meintest, also *ein* Zeichen und zwar das Tabulatorzeichen? Was natürlich auch nur Sinn macht wenn die Spalten durch Tabulatoren getrennt wären.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hallo,

danke schonmal für die Antwort.
Was ich mir dabei gedacht habe? Google gefragt - bekam das als Antwort. Jedenfalls funktioniert es auch so ganz gut bei mir. Meine CSV hat 300 Zeilen und mein Array, dass ich erhalte, hat 300 Elemente.

Nichts destotrotz brauch ich zwei delimiter: einen für die Zeilen, einen für die Werte. Es sind leider aus strings in der csv enthalten, deshalb würde ich gerne erstmal eine 300X30 Matrix erhalten in welchem in den einzelnen Elementen die Strings stehen. Anschließend möchte ich die erste Spalte löschen (dort stehen die strings) und den rest von strings in floats64 wandeln.

Falls jemand eine elegantere Lösung hat - ich bin offen dafür :)


ps: in meinem code steht natürlich "\t"


Schönen Gruß
BlackJack

@Pittan: Wieso brauchst Du einen Delimiter für die Zeilen? Wenn das was anderes ist als Zeilenenden, dann kannst Du die Funktion so nicht verwenden. Das würde ja auch bedeuten die Datei würde nur aus einer Zeile bestehen.

Spalten die verarbeitet werden sollen kann man mit `usecols` angeben, oder man liest halt erst einmal alles ein und wählt davon dann alles ausser der ersten Spalte aus.

Edit: Wenn am ende eh alles Zahlen vom gleichen Typ werden sollen, dann ist `recfromcsv()` vielleicht auch nicht so praktisch. Statt „records” möchte man dann eher ein homogenes 2D-Array mit `genfromtext()` erstellen. Die Zeichenketten in der ersten Spalte werden dann zu NaN-Werten.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Man - ich habe doch auch keine Ahnung was ich hier eigentlich mache ;)

meine CSV sieht so aus:
TemperaturBadezimmer; 23,4; 24,3;.....; 22,9
TemperaturKüche; 22,9;23,3;.....;22,0
....
....
TemperaturWohnzimmer;23,9; 22,1;...;21;8


Wenn das alles so falsch ist, wie ich es bisher eingelesen habe - wie mache ich es denn dann richtig? Wie lese ich erstmal "alles" ein und trenne dann anschließend das Array?

Danke
Gruß
BlackJack

@Pittan: Sind da wirklich *Kommas* in den Zahlen? Dann wird's sowieso etwas umständlicher. Falls Du das kontrollieren kannst, würde ich das ändern. Und ich würde dann auch die Werte als Spalten statt als Zeilen organisieren. Denn eine führende Zeile lässt sich leichter ignorieren als eine Spalte, beziehungsweise könnte man eine Kopfzeile auch *benutzen*.

Code: Alles auswählen

import numpy as np


def main():
    with open('test.csv', 'rb') as lines:
        data = np.genfromtxt(
            (line.replace(',', '.') for line in lines), delimiter=';'
        )
        print data
        print data[:, 1:]


if __name__ == '__main__':
    main()
Daten:

Code: Alles auswählen

TemperaturBadezimmer; 23,4; 24,3;22,9
TemperaturKüche; 22,9;23,3;22,0
TemperaturWohnzimmer;23,9; 22,1;21,8
Antworten