2016-07-27 7 views
0

Ich versuche, unten mit np.savetxt Arrays von mehreren Formaten wie Show-Datei zu drucken:Wie Drucken von Arrays aus mehreren Datenformaten mit der Steuerung der Genauigkeit von Gleitkommazahlen in Python?

import numpy as np 
f = open('./multiple_format.dat', 'w') 
c1 = np.array(['A', 'B']) 
n1 = np.array([1.545446367853, 6.8218467347894]) 
n2 = np.array([1.546715887182, 2.9718145367852]) 

np.savetxt(f, np.column_stack([c1, np.around(n1, decimals = 3), np.round(n2, 3)]), fmt='%s', delimiter='\t') 

Ich habe bereits zwei Antworten auf A1 und A2 gesehen, erfordern einige der Antworten in diesen Stellen die Zeichenbreite angegeben und entsprechend Leerraum werden soll, vor dem String-Array zur Verfügung gestellt, wenn sie kürzer als diese Breite ist wie unten dargestellt:

import numpy as np 
f = open('./multiple_format.dat', 'w') 
c1 = np.array(['A', 'B']) 
n1 = np.array([1.545446367853, 6.8218467347894]) 
n2 = np.array([1.546715887182, 2.9718145367852]) 

A['v1'] = c1 
A['v2'] = n1 

np.savetxt(f, A, fmt="%10s %10.3f") 

ich brauche keinen Raum führt vor dem String und ich brauche np.savetxt Arrays drucken von mehreren Datenformaten mit Kontrolle auf Präzision von Schwimmern. Wie kann das in Python gemacht werden?

Antwort

0

Der Kern savetxt ist

  for row in X: 
      try: 
       fh.write(asbytes(format % tuple(row) + newline)) 

Es auf die Zeilen Ihres Arrays iteriert und wendet

format % tuple(row) 

es in einen String zu drehen.

format wird aus Ihrem fmt Parameter gebildet. In Ihrem Fall mit 2 % items it uses the fmt` wie:

In [95]: "%10s %10.3f"%tuple(np.array([1.545446367853, 6.8218467347894])) 
Out[95]: '1.54544636785  6.822' 

Also, wenn es um Abstand und Präzision geht, sind Sie bei der Gnade der Standard-Python-Formatierungssystem. Ich würde vorschlagen, direkt mit dieser Art von Ausdruck zu spielen.

In [96]: "%.2f, %10.3f"%tuple(np.array([1.545446367853, 6.8218467347894])) 
Out[96]: '1.55,  6.822' 
In [97]: "%.2f, %.10f"%tuple(np.array([1.545446367853, 6.8218467347894])) 
Out[97]: '1.55, 6.8218467348' 
In [106]: (', '.join(["%.2e"]*2))%tuple([1.545446367853, 6.8218467347894]) 
Out[106]: '1.55e+00, 6.82e+00' 
Verwandte Themen