Seite 1 von 1

mehrdimensionale arrays als ascii speichern

Verfasst: Mittwoch 31. Januar 2007, 09:46
von lise
hallo,

ich bin gerade dabei, mich in python "hineinzuschnuppern". finde ja, daß es eine gute entscheidung war, allerdings komm ich noch nicht so ganz mit den tausenden von hilfen klar, d.h. hab' einfach noch nicht die richtige für mein kleines problemchen gefunden. vielleicht findet sich ja hier jemand, der mir einen kleinen tip geben kann?

mein problem: es muß doch einen einfachen befehl geben, sowas in der art wie 'save' oder 'write'*, mit dem man mehrdimensionale arrays als ascii schreiben kann? für ein 2dim array z.b. sollen im file dann 2 spalten mit den werten stehen. binär hab' ich das ganze schon untergebracht, auch 1dim arrays sind kein problem als ascii (mit schleife). oder sollte ich nun einfach 2 schleifen draus machen? kann man das dann trotzdem wieder als 2 spalten rauslesen? also n schleifen für n dimensionen? das geht doch bestimmt auch eleganter? welches package benötige ich?

lg und danke,
lise

Verfasst: Mittwoch 31. Januar 2007, 10:03
von jens
"pickle" ist das Stichwort. Such mal im Forum danach ;)

Verfasst: Mittwoch 31. Januar 2007, 11:30
von BlackJack
Oder wenn es wirklich Textdateien werden sollen, das `csv`-Modul.

Verfasst: Mittwoch 31. Januar 2007, 14:23
von lise
danke, javascript:emoticon(':)')
Smile
ich werd' mir das alles mal anschauen. mir ist da inzwischen auch noch eine andere möglichkeit ein- bzw. aufgefallen:

hier ist mein codeschnipsel:
***********************

Code: Alles auswählen

value_table_scipy = scipy.array(value_table)    
t_value_table = value_table_scipy.transpose()

[color=orange]def[/color][color=blue]save_valueTable_asText[/color]():
    valueTable_txt = scipy.array(t_value_table)  [color=red]# wieso muss man hier 'umwandeln'?[/color]
    f_txt = [color=indigo]file[/color]([color=green]'save_valueTable_text.dat'[/color], [color=green]'w'[/color])
    scipy.io.write_array(f_txt, valueTable_txt)
    f_txt.close()

[color=orange]def[/color] [color=blue]read_valueTable_fromText[/color]():
    f_txt = [color=indigo]file[/color]([color=green]'save_valueTable_text.dat'[/color], [color=green]'r'[/color])
    valueTable_txt = scipy.io.read_array(f_txt)
    [color=orange]print[/color] valueTable_txt
    [color=orange]global[/color] table
    table = valueTable_txt

save_valueTable_asText()
read_valueTable_fromText()
****************************javascript:emoticon(':D')
Very Happy (weil funktioniert...)

sollte einer der meinung sein, das geht definitiv einfacher, eleganter oder
sonst wie günstiger, soll er/sie mir das bitte mitteilen, damit ich mir meinen Rundumblick aufbauen kann; einstweilen läufts erst mal..

lise

Verfasst: Mittwoch 31. Januar 2007, 14:34
von lise
sorry für den buchstabenmüll - hier kommt der code noch mal, da ich das problem gerade noch suche, eben erst mal "ungehighlighted":

***************************

Code: Alles auswählen

def save_valueTable_asText():
    valueTable_txt = scipy.array(t_value_table)  # warum 'umwandeln'?
    f_txt = file('save_valueTable_text.dat', 'w')
    scipy.io.write_array(f_txt, valueTable_txt)
    f_txt.close()

def read_valueTable_fromText():
    f_txt = file('save_valueTable_text.dat', 'r')
    valueTable_txt = scipy.io.read_array(f_txt)
    print valueTable_txt
    global table
    table = valueTable_txt

save_valueTable_asText()
read_valueTable_fromText()
***************************
lise

Verfasst: Mittwoch 31. Januar 2007, 14:35
von EnTeQuAk
öhmm kleiner Tipp... deinen gesamten Code einfach in

Code: Alles auswählen

[code=py]#hier steht der Code
[/code] einfügen.

sieht dann so aus:

Code: Alles auswählen

#hier steht dann der Code
print 'Test... hier ein farblich hervorgehobenes "print"'
#usw...
und ... es gibt eine EDIT Funktion :D

MfG EnTeQuAk

Verfasst: Mittwoch 31. Januar 2007, 14:38
von jens

Verfasst: Mittwoch 31. Januar 2007, 14:46
von lise
:lol:

Code: Alles auswählen

value_table_scipy = scipy.array(value_table)    
t_value_table = value_table_scipy.transpose() 

def save_valueTable_asText():
    valueTable_txt = scipy.array(t_value_table)  # warum 'umwandeln'?
    f_txt = file('save_valueTable_text.dat', 'w')
    scipy.io.write_array(f_txt, valueTable_txt)
    f_txt.close()

def read_valueTable_fromText():
    f_txt = file('save_valueTable_text.dat', 'r')
    valueTable_txt = scipy.io.read_array(f_txt)
    print valueTable_txt
    global table
    table = valueTable_txt

save_valueTable_asText()
read_valueTable_fromText() 

Verfasst: Mittwoch 31. Januar 2007, 14:58
von Leonidas
lise hat geschrieben:sollte einer der meinung sein, das geht definitiv einfacher, eleganter oder sonst wie günstiger, soll er/sie mir das bitte mitteilen, damit ich mir meinen Rundumblick aufbauen kann; einstweilen läufts erst mal..
Ja, Serialisierung mit `pickle` ist definitiv einfacher, eleganter und auch sonstwie günstiger.

Verfasst: Mittwoch 31. Januar 2007, 15:01
von lise
ich hätte da noch eine zusätzliche frage:

wie kann ich möglichst einfach (mit meiner Variante, wenn irgendwie geht) alle Werte im Array im Format %.4e schreiben?

lise

Verfasst: Mittwoch 31. Januar 2007, 15:11
von mawe
Passt das zu "Links und Tutorials"? Ich schieb mal ...

Verfasst: Mittwoch 31. Januar 2007, 15:16
von jens
lise hat geschrieben:wie kann ich möglichst einfach (mit meiner Variante, wenn irgendwie geht) alle Werte im Array im Format %.4e schreiben?
Solltest du das nicht besser bei der Ausgabe machen?

So geht's:

Code: Alles auswählen

print "%.4e" % 1254634.435345
Raus kommt:
1.2546e+006

Verfasst: Mittwoch 31. Januar 2007, 17:39
von CM
Hoi,

ich klinke mich wohl etws spät in die Diskussion ein, aber kennt ihr PyTables? Dieses Modul erleichert mit Sicherheit die Arbeit mit wirklich großen Datensätzen.

Ansonsten bevorzuge ich ja das Verpacken meiner array-Daten in physikalischen Kontext in einer Klasse und Picklen der Klasseninstanzen.

Ansonsten, lise, zu Deinem Schnipsel: Du mußt umwandeln, weil scipy / numpy nur mit numpy-Arrays verfahren kann. Listen und Tuple müssen vorher konvertiert werden. Außerdem verstehe ich das global-Statement nicht, welchen Sinn soll das haben? Besser wäre es die Daten an die Funktionen zu übergeben und das eine oder andere return-Statement.

Zum Schluß noch meine unmaßgebliche Meinung zum Thema Speichern und Präzission (wobei ich nicht weiß, ob ich die Frage richtig verstanden habe): Niemals (!) runden beim Speichern von Daten. (Eigentlich überhaupt nicht runden, außer vielleicht bei einer finalen Ausgabe, um es schön benutzerfreundlich zu halten.)

Gruß,
Christian

edit: Rechtschreibung

Verfasst: Donnerstag 1. Februar 2007, 09:02
von lise
:)

jens:
so werd' ich's dann also erst mal machen, danke; ursprünglich wollte ich die Daten schon 'schick fertig' speichern, damit man sie mit einem beliebigen anderen Programm auswerten kann und sozusagen immer das gleiche drinsteht (müßte dann nicht dauernd diesselbe Frage beantworten...) Aber da ich die Auswertesoftware wohl gleich mitliefern werde, ist das ja egal...

CM:
PyTables hatte ich auch schon im Auge, sieht bloß irgendwie für's Erste kompliziert aus (und isch hab's n'bissl eilig...)
zum 'global': hab' mir irgendwie eingebildet, daß ich damit eine globale Variable 'definiere'? Vorher hatte ich versucht meine Daten einfach an eine Variable zu übergeben, als eingelesenes Array eben, das ist allerdings fehlgeschlagen, so ging's dann.

lg, lise

Verfasst: Donnerstag 1. Februar 2007, 09:04
von jens
Zum Thema 'global': [wiki]Die global-Anweisung[/wiki]