Numpy Array2String - Format je Spalte definieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

Hallo Zusammen,

ich habe folgenden Numpy Array:

Code: Alles auswählen

[[  1.00000e+00   3.09120e-01   5.58157e+00   2.12157e+01  -8.04374e-01]
 [  2.00000e+00   1.54953e-01   5.61421e+00   2.08844e+01  -2.25799e-01]
 [  3.00000e+00   0.00000e+00   5.64258e+00   2.05531e+01   3.52776e-01]]
Ich möchte diesen nun mittels numpy.array2string() so formatieren, dass ich auf folgendes Ergebnis komme:

Code: Alles auswählen

[[  1   0.309120   5.581570   21.215700  -0.804374]
 [  2   0.154953   5.614210   20.884400  -0.225799]
 [  3   0.000000   5.642580   20.553100   0.352776]]
Angenommen np_arr = obiger Numpy Array, dann kann ich mit:
numpy.array2string(np_arr, formatter={'float_kind':lambda x: "%10.6f" % x}) alle Spalten im von mir gewünschten 'Float'-format speichern.
Nun möchte ich aber gern die erste Spalte als Integer formatieren.

Mit numpy.savetxt() kann ich für jede Spalte einen individuellen 'Formatter' definieren, geht dies auch mit numpy.array2string?
Ich möchte hier erstmal den sttring lokal speichern und nocht nicht in eine Datei schreiben.

Gruß
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kniffte: Du kannst savetxt auch mit einem StringIO-Objekt benutzen und so einen String erzeugen.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@Sirius3: Danke...diese Lösung gefällt mir.

Habe beim suchen noch eine andere Möglichkeit gefunden:

Code: Alles auswählen

import numpy as np

np_arr = np.array([[  1.00000e+00,   3.09120e-01,   5.58157e+00,   2.12157e+01,  -8.04374e-01],
 [  2.00000e+00,   1.54953e-01,   5.61421e+00,   2.08844e+01,  -2.25799e-01],
 [  3.00000e+00,   0.00000e+00,   5.64258e+00,   2.05531e+01,   3.52776e-01]], dtype=object)
np_arr[:,0] = np_arr[:,0].astype(int)
txt_arr = np.array2string(np_arr, formatter={'float_kind':lambda x: "%10.6f" % x})
Das ergibt soweit auch das gewünschte Ergebnis als String in txt_arr.
Spricht irgendetwas hinsichtlich Performance, Stil, Speicher, ... gegen diese Vorgehensweise im Vergleich zur Variante numpy.savetxt() & StringIO-Objekt ?
BlackJack

@Kniffte: Ein Numpy-Array vom `dtype` `object` ist IMHO ein „code smell“.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kniffte: objekt-Arrays sind für die Performance schlecht, vom Stil her schlecht, wenn sowieso nur Zahlen gespeicher werden, und vom Speicher schlecht, weil jedes Element ein eigenes Objekt ist.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@Sirius3 & @BlackJack:
Dank euch beiden!
Antworten