numpy.array als csv speichern

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
Benutzeravatar
tromai
User
Beiträge: 92
Registriert: Mittwoch 26. April 2006, 11:20

Hallo zusammen,

ich habe momentan das Problem, dass ich ein relativ großes zweidimensionales Array als CSV speichern möchte.
Das geht ganz gut mit

Code: Alles auswählen

arr.tofile('filename.csv', sep=';', format = "%5.1f")
Das Problem ist, dass es als fortlaufender Text gespeichert wird. Ich suche nun nach einer Möglichkeit das in Zeilen abzuspeichern, so dass jede "Zeile" des Arrays in einer separaten Zeile steht.
Also:

Code: Alles auswählen

5;2;1
2;1;1
64;2;5
statt:

Code: Alles auswählen

5;2;1;2;1;1;64;2;5
Numpy müsste da doch sicherlich mit der Funktion eine Möglichkeit mitliefern oder zumindest andere Möglichkeiten bieten. Eine Doku zu der Funktion habe ich leider nicht gefunden, bzw. keine in der darüber ein Wort verloren wird.

scipy.write_array() habe ich auch schon ausprobiert. Allerdings hat das auch nicht zum gewünschten Ergebnis geführt.

Das ganze über eine Schleife zu lösen kommt auf Grund der Größe des Arrays und Performancegründen nicht in Frage.

Für Hilfe wäre ich sehr dankbar.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

eine ganze Reihe von Antworten findest Du hier:
http://www.scipy.org/Cookbook/InputOutput

Außerdem vielleicht für Dich interessant:

Code: Alles auswählen

In [1]: from numpy import *

In [2]: x = random.random_integers(0, high=100, size=9)

In [3]: x = x.reshape((3,3))

In [4]: x.dump('data.dat')

In [5]: x
Out[6]:
array([[94,  6, 50],
       [38, 70, 87],
       [44, 80, 80]])

Code: Alles auswählen

In [1]: from numpy import *

In [2]: x = load('data.dat')

In [3]: x
Out[3]: 
array([[94,  6, 50],
       [38, 70, 87],
       [44, 80, 80]])
Gut, das ist jetzt eben nicht gerade CSV, aber vielleicht trotzdem interessant. Dies hier ist exakt, was Du suchst:

Code: Alles auswählen

In [4]: from scipy.io import write_array

In [5]: write_array("myfile.txt", x, separator=';', linesep='\n')
Gruß,
Christian

PS In der letzten Zeit hat das scipy Cookbook manchmal Probleme. Mir scheint der Server läuft nicht stabil. Deswegen habe ich das hier nochmal kurz gepastet. Nicht die Geduld verlieren, irgendwann funktioniert die Seite sicher und dort gibt es noch wesentlich mehr Tipps - auch zum Thema.
Benutzeravatar
tromai
User
Beiträge: 92
Registriert: Mittwoch 26. April 2006, 11:20

OK, danke für die Infos. Ich hatte gestern auch dauernd Probleme mit der Seite und habe deshalb dann auch hier gepostet, weil ich einfach nicht weitergekommen bin.

Mit der scipy.io Funktion hat es jetzt geklappt. Die hatte ich zwar auch schon ausprobiert aber irgendwas muss ich wohl falsch gemacht haben.

Ein Problem habe ich jetzt allerdings noch:
In dem Moment in dem ich mit floats arbeite nutzt er das wissenschaftliche Fließkommaformat. Also 1.23e+1 statt 12,3. Kann man das irgendwie abstellen? Das File muss dummerweise von Otto-Normalusern einfach lesbar sein. Bei kleineren arrays macht das interessanterweise keine Probleme. Erst ab gewissen Dimensionen fängt er an die Zahlen auf diese Weise rauszuschreiben.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

die Änderung mit der Größe des Files finde ich seltsam. Keine Ahnung woher das rühren könnte. write_array erlaubt aber den Paramter "precision" zu übergeben, per default auf 5 - warum auch immer. Du kannst ja mal precision=1 oder so übergeben und schauen ob's hilft.
Ansonsten: :?: Vielleicht die mailingliste um Rat bitten?

Gruß,
Christian
Benutzeravatar
tromai
User
Beiträge: 92
Registriert: Mittwoch 26. April 2006, 11:20

An dem Parameter habe ich auch schon rumgeschraubt. Hat leider nur dazu geführt, dass er dann einfach Stellen abschneidet.

Allerdings habe ich festgestellt, dass das Modul extrem langsam ist. Man gewinnt eigentlich nicht besonders viel gegenüber einer Schleife.

Allerdings bin ich auf das csv-Modul gestoßen. Das scheint mir ziemlich vielversprechend und soll auch laut mehreren Kommentaren extrem schnell sein. Wenn ich es ausprobiert habe werde ich mal berichten, wie es mit der Geschwindigkeit im Vergleich zu write_array ausschaut.
Benutzeravatar
tromai
User
Beiträge: 92
Registriert: Mittwoch 26. April 2006, 11:20

Ich habe das CSV-Modul jetzt getestet:

Code: Alles auswählen

from numpy import * 
from csv import * 

arr = zeros((5,5)) 
f = file("xyz.csv", 'w') 

wr = writer(f) 
wr.writerows(arr)
Das ganze ist deutlich schneller als scipy.io.write_array. Ich bin jetzt eigentlich nur noch am suchen ob ich die einzelnen Array-Elemente formatiert ausgeben kann, da mir eine Nachkommastelle eigentlich reicht. Bei einem Datensatz von 810000 Werten würde das die rersultierende Datei deutlich schlanker machen.
Antworten