Mehrere Vektoren in .txt spechern - Workflow

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
gerald123
User
Beiträge: 36
Registriert: Donnerstag 10. September 2015, 12:10

Hallo Leute,

ich muss die Ergebnisse einer Simulation bearbeiten und als .txt- File abspeichern.
Beispielcode:

Code: Alles auswählen

T1 = result.data("Gebäude.Temperatur1")
T2 = result.data("Gebäude.Temperatur3")
T3 = result.data("Gebäude.Temperatur2")
..
T1 ..Tn sind numpy arrays mit einer Spalte und ein paar tausend Zeilen.
Ich hab es jetzt folgendermaßen gelöst:
np.savetxt(r'D:\Ergebnis.txt', np.transpose([T1, T2, T...]), delimiter=',', header = "T1, T2,... \n", newline=os.linesep, fmt='%1.5f')
Da ich solche Auswertungen in Zukunft oft brauchen werde und die Variablennamen oft sehr lang sind, meine Frage: Gibt es eine elegantere Lösung?
Z.b: Die Variablennamen automatisch in einer Liste speichern und dann mit np.transpose() verknüpfen?

Würde mich über Tipps sehr freuen.
LG
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

brauchst du denn die variablen-namen? wenn du sie nicht brauchst, nimm doch einfach eine liste
und dann kannst du auch recht einfach auf den index zugreifen

Code: Alles auswählen

results = []
results.append(result.data("Gebäude.Temperatur1"))
results.append(result.data("Gebäude.Temperatur2"))
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

ah ich seh gerade, dass du die namen doch benötigst. dann probiere es vllt mit einem dictionary.

Code: Alles auswählen

results = {}
results["t1"] = result.data("Gebäude.Temperatur1")
results["t2"] = result.data("Gebäude.Temperatur2")

Code: Alles auswählen

np.savetxt(r'D:\Ergebnis.txt', np.transpose(results.values()), delimiter=',', header = ", ".join(results.keys()), newline=os.linesep, fmt='%1.5f') 
wenn die reihenfolge entscheidend ist, probiere es mit einem ordered-dict
gerald123
User
Beiträge: 36
Registriert: Donnerstag 10. September 2015, 12:10

Hey,

vielen Dank für deine Hilfe.
Frage: Was macht ".join(results.keys()"?
Danke
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

join fügt die strings in der liste zusammen und nutzt als platzhalter den string, der davor steht

Code: Alles auswählen

In [1]: s = ["Hallo", "du", "schoene", "Welt"]

In [2]: " ".join(s)
Out[2]: 'Hallo du schoene Welt'

In [3]: "-".join(s)
Out[3]: 'Hallo-du-schoene-Welt'

In [4]: " - ".join(s)
Out[4]: 'Hallo - du - schoene - Welt'

In [5]: "".join(s)
Out[5]: 'HalloduschoeneWelt'
gerald123
User
Beiträge: 36
Registriert: Donnerstag 10. September 2015, 12:10

Großartig - vielen Dank :!:

Eine letzte Frage noch:
Ich muss alle Werte in Celsius umwandeln; beim einfachen Code vorher hat folgendes funktioniert:

Code: Alles auswählen

np.savetxt(r'D:\Ergebnis.txt', np.transpose([TempC-273.15]),...)
jetzt

Code: Alles auswählen

np.savetxt(r'D:\Ergebnis.txt', np.transpose([D.values()-273.15]),...)
bekomme ich folgende Fehlermeldung: unsupported operand type(s) for -: 'list' and 'float'
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

D.values() gibt dir eine liste mit den werten in deinem dictionary zurück.
du versuchst also 273 von einer liste abzuziehen und das geht nicht. ich nehme an, dass wieder eine liste erwartet wird. also benutze eine list comprehension

Code: Alles auswählen

np.savetxt(r'D:\Ergebnis.txt', np.transpose([value - 273.15 for value in D.values()]),...)
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Probier das mal

Code: Alles auswählen

np.savetxt(r'D:\Ergebnis.txt', np.transpose([D.values()])-273.15,...)
Du kannst aber nicht davon ausgehen, dass values() die Werte in der von Dir gewünschten Reihenfolge zurückgibt:
https://docs.python.org/2/library/stdty ... dict.items
"CPython implementation detail: Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary’s history of insertions and deletions."
D.h. in der Ausgabe weißt Du nicht welche Spalte zu welchem Gebäude gehört.

Code: Alles auswählen

>>> a = {"t%i" % i: i for i in range(1,15)}
>>> a.values()
[8, 9, 6, 7, 4, 5, 2, 3, 1, 14, 10, 11, 12, 13]
Ich würde nicht so einen Mischmasch aus Listen, Dictionaries und Numpy-Arrays programmieren. Die Arrays T1 bis Tn scheinen ja alle gleich lang zu sein, sonst würde das mit transpose und savetxt so nicht klappen. Ich würde deshalb zunächst ein 2D-Array dimensionieren und dieses dann spaltenweise füllen:

Code: Alles auswählen

t_count = ... # Anzahl der Messwerte pro Gebäude
building_count = ... # Anzahl der Gebäude
T = np.empty((t_count, building_count), dtype=np.float64)
T[:,0] = result.data("Gebäude.Temperatur1")
T[:,1] = result.data("Gebäude.Temperatur2")
T[:,2] = result.data("Gebäude.Temperatur3")

T -= 273.15 # Kelvin zu Celsius

np.savetxt(r'D:\Ergebnis.txt', T,...)
a fool with a tool is still a fool, www.magben.de, YouTube
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

deswegen sagte ich ja, dass ein ordered-dict besser wäre, so die reihenfolge wichtig ist.

dass keys(), items() oder values() nicht die richtige reihenfolge ausspuckt weiß ich.
aber meiner erfahrung nach, werden bei allen drei methoden die ergebnisse in gleicher reihenfolge ausgegeben.
oder unterliege ich da einem irrglauben?

Code: Alles auswählen

In [1]: a = {"t%i" % i: i for i in range(1,15)}

In [2]: a.values()
Out[2]: [8, 9, 6, 7, 4, 5, 2, 3, 1, 14, 10, 11, 12, 13]

In [3]: a.keys()
Out[3]: ['t8', 't9', 't6', 't7', 't4', 't5', 't2', 't3', 't1', 't14', 't10', 't11', 't12', 't13']
Antworten