Seite 1 von 1
Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 10:23
von gerald123
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
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 10:36
von stefanbunde
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"))
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 10:41
von stefanbunde
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
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 11:04
von gerald123
Hey,
vielen Dank für deine Hilfe.
Frage: Was macht ".join(results.keys()"?
Danke
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 11:14
von stefanbunde
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'
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 11:33
von gerald123
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'
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 11:45
von stefanbunde
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()]),...)
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 12:54
von MagBen
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,...)
Re: Mehrere Vektoren in .txt spechern - Workflow
Verfasst: Freitag 30. Oktober 2015, 13:03
von stefanbunde
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']