Numpy Array2String - Format je Spalte definieren

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

Numpy Array2String - Format je Spalte definieren

Beitragvon Kniffte » Montag 30. Januar 2017, 16:45

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: 6384
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Numpy Array2String - Format je Spalte definieren

Beitragvon Sirius3 » Montag 30. Januar 2017, 20:18

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

Re: Numpy Array2String - Format je Spalte definieren

Beitragvon Kniffte » Dienstag 31. Januar 2017, 10:18

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

Habe beim suchen noch eine andere Möglichkeit gefunden:

  1. import numpy as np
  2.  
  3. np_arr = np.array([[  1.00000e+00,   3.09120e-01,   5.58157e+00,   2.12157e+01,  -8.04374e-01],
  4.  [  2.00000e+00,   1.54953e-01,   5.61421e+00,   2.08844e+01,  -2.25799e-01],
  5.  [  3.00000e+00,   0.00000e+00,   5.64258e+00,   2.05531e+01,   3.52776e-01]], dtype=object)
  6. np_arr[:,0] = np_arr[:,0].astype(int)
  7. 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

Re: Numpy Array2String - Format je Spalte definieren

Beitragvon BlackJack » Dienstag 31. Januar 2017, 11:50

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

Re: Numpy Array2String - Format je Spalte definieren

Beitragvon Sirius3 » Dienstag 31. Januar 2017, 11:54

@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: 59
Registriert: Dienstag 27. September 2016, 11:05

Re: Numpy Array2String - Format je Spalte definieren

Beitragvon Kniffte » Dienstag 31. Januar 2017, 13:23

@Sirius3 & @BlackJack:
Dank euch beiden!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder