¿Cómo establecer la precisión en str (numpy.float64)?

Necesito escribir un par de floats numpy en un archivo csv que tiene contenido de cadena adicional. por lo tanto, no uso savetxt, etc. con numpy.set_printoptions () solo puedo definir el comportamiento de impresión, pero no el comportamiento str () Sé que extraño algo y no puede ser tan difícil, pero no encuentro una respuesta razonable en las interwebs. Tal vez alguien pueda apuntarme en la dirección correcta. Heres algún código de ejemplo:

In [1]: import numpy as np In [2]: foo = np.array([1.22334]) In [3]: foo Out[3]: array([ 1.22334]) In [4]: foo[0] Out[4]: 1.2233400000000001 In [5]: str(foo[0]) Out[5]: '1.22334' In [6]: np.set_printoptions(precision=3) In [7]: foo Out[7]: array([ 1.223]) In [8]: foo[0] Out[8]: 1.2233400000000001 In [9]: str(foo[0]) Out[9]: '1.22334' 

¿Cómo convierto np.float en una cadena con un formato agradable, que puedo enviar a file.write ()?

Saludos cordiales,

fookatchu

Puedes usar el formato de cadena estándar:

 >>> x = 1.2345678 >>> '%.2f' % x '1.23' 

Puede usar el formato de cadena normal, consulte: http://docs.python.org/library/string.html#formatspec

Ejemplo:

 print '{:.2f}'.format(0.1234) # '0.12' print '{:.2e}'.format(0.1234) # '1.23e-01' 

Numpy 1.14 y posteriores tienen las funciones format_float_positional y format_float_scientific para formatear un escalar de punto flotante como una cadena decimal en notación posicional o científica, con control sobre el redondeo, el recorte y el relleno. Estas funciones ofrecen mucho más control sobre el formateo que los formateadores de cadenas de Python convencionales.

 import numpy as np x = np.float64('1.2345678') print(np.format_float_positional(x)) # 1.2345678 print(np.format_float_positional(x, precision=3)) # 1.235 print(np.format_float_positional(np.float16(x))) # 1.234 print(np.format_float_positional(np.float16(x), unique=False, precision=8)) # 1.23437500 y = x / 1e8 print(np.format_float_scientific(y)) # 1.2345678e-08 print(np.format_float_scientific(y, precision=3, exp_digits=1)) # 1.235e-8 

etc.


Estos formateadores avanzados están basados ​​en el algoritmo Dragon4; vea los números de punto flotante de impresión de Ryan Juckett para leer más sobre el tema.

En lugar de str(foo[0]) , use "%.3f" % foo[0] .

También puedes hacer:

 precision = 2 str(np.round(foo[0], precision)) 

Tuvo algunas ventajas para mí sobre el (‘% .2f’% x) cuando tuve que hacer una cadena de str (np.log (0.0)) que está perfectamente tratada con “-inf” por numpy para que no tengas molestar aquí