Numpy Array oder Pandas DataFrame

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
scandium
User
Beiträge: 25
Registriert: Montag 26. Januar 2015, 18:52

Hallo Zusammen,

nach dem Einlesen einer ASCII Datei, kann ich die Daten in Form eines Numpy Arrays aufbauen.
Zusätzlich zu der mxn Matrix, benötige ich jedoch eine Spalte mit Informationen in Form Strings.
Bisher habe ich eine Matrix(a) mit den Float64 Werten und einen Vector(b) mit 'numpy.str'.
Verbinde ich beide Matrizen mit "np.hstack((a,b))" bekomme ich Matrix mit String Werten.

Gibt es eine Möglichkeit eine Matrix zu erzeugen, die weiterhin Float + Strings hat.

Oder schreibt man die Daten besser in ein Pandas DataFrame und rechnet dann damit?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Du kannst in Numpy neben den vordefinierten dtypes auch selbstdefinierte zusammengesetzte dtypes haben:
http://docs.scipy.org/doc/numpy/referen ... nstructing

Ich würde das aber so nicht machen. Das String- und das Float Array gehören zwar zusammen, enthalten aber unterschiedliche Daten. Die wohl auch unterschiedlich weiterverarbeitet werden sollen. Deshalb würde ich sie nicht umständlich in das gleiche Array pressen, sondern die Zusammengehörigkeit über eine Klasse realisieren.

Pandas würde ich dann nehmen, wenn es sich um Zeitreihen handelt.
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@scandium: Man kann unterschiedliche Datentypen in ein numpy-array packen, wobei man die einzelnen Felder per Namen anspricht, z.B:

Code: Alles auswählen

with open('data.txt') as input:
    data = numpy.genfromtxt(input, delimiter=';', dtype=[('name','|S60'),('values','99d')])
    print data['name']
    print data['values']
scandium
User
Beiträge: 25
Registriert: Montag 26. Januar 2015, 18:52

@Sirius3:
Ich habe probiert dein Beispiel laufen zu lassen. Dafür habe ich eine txt Datei erzeugt die wie folgt aussieht:

data.txt:
hx1,1
hx2,2
hx3,3
hx4,4

dann habe ich das Script laufen lassen:

Code: Alles auswählen

import numpy as np
with open('data.txt') as input:
    data = np.genfromtxt(input, delimiter=',', dtype=[('name','|S60'),('values','99d')])
Leider bekomme ich folgende Fehlermeldung:"TypeError: Can't convert 'bytes' object to str implicitly"
Was müsste ich korrigieren, damit das Script läuft?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Ich denke die '99d' sind bei Deinem Beispiel falsch. '99d' bedeutet, dass da 99 Double Werte (64bit Floats) kommen sollen. Bei Dir in der Testdatei kommt danach aber nur 1 Zahl. Probier das mal:

Code: Alles auswählen

import numpy as np
data = np.genfromtxt('data.txt', delimiter=',', dtype=[('name','|S60'),('values','1d')])
print( data['name'])
print( data['values'])
Das Öffnen und Schließen der Datei kannst Du übrigens Numpy machen lassen. Auch würde ich in der Regel eher numpy.loadtxt nehmen, es sei denn ich brauche die Funktionalität von numpy.genfromtxt um fehlende oder fehlerhafte Daten zu handeln.
a fool with a tool is still a fool, www.magben.de, YouTube
scandium
User
Beiträge: 25
Registriert: Montag 26. Januar 2015, 18:52

@MagBen,

Danke, jetzt funktioniert das Skript.

Könnte man die Matrix "data" auch von 4x1 auf 4x2 ändern?
In der zweiten Spalte hätte ich gerne die Werte nach den Komma, in dem Fall Interger, so dass man gleich mit dem eingelesenen Werten rechnen kann.
Antworten