Imprima una matriz NumPy sin notación científica y con una precisión determinada
¿Cómo imprimo matrices NumPy formateadas de una manera similar a esta?
x = 1.23456
print('%.3f' % x)
Si quiero imprimir los numpy.ndarray
números flotantes, imprime varios decimales, a menudo en formato "científico", que es bastante difícil de leer incluso para matrices de baja dimensión. Sin embargo, numpy.ndarray
aparentemente tiene que imprimirse como una cadena, es decir, con %s
. ¿Existe alguna solucion para esto?
Úselo numpy.set_printoptions
para establecer la precisión de la salida:
import numpy as np
x = np.random.random(10)
print(x)
# [ 0.07837821 0.48002108 0.41274116 0.82993414 0.77610352 0.1023732
# 0.51303098 0.4617183 0.33487207 0.71162095]
np.set_printoptions(precision=3)
print(x)
# [ 0.078 0.48 0.413 0.83 0.776 0.102 0.513 0.462 0.335 0.712]
Y suppress
suprime el uso de notación científica para números pequeños:
y = np.array([1.5e-10, 1.5, 1500])
print(y)
# [ 1.500e-10 1.500e+00 1.500e+03]
np.set_printoptions(suppress=True)
print(y)
# [ 0. 1.5 1500. ]
Para aplicar opciones de impresión localmente , usando NumPy 1.15.0 o posterior, puede usar el numpy.printoptions
administrador de contexto. Por ejemplo, dentro de with-suite
precision=3
y suppress=True
se establecen:
x = np.random.random(10)
with np.printoptions(precision=3, suppress=True):
print(x)
# [ 0.073 0.461 0.689 0.754 0.624 0.901 0.049 0.582 0.557 0.348]
Pero fuera de las with-suite
opciones de impresión vuelven a la configuración predeterminada:
print(x)
# [ 0.07334334 0.46132615 0.68935231 0.75379645 0.62424021 0.90115836
# 0.04879837 0.58207504 0.55694118 0.34768638]
Si está utilizando una versión anterior de NumPy, puede crear el administrador de contexto usted mismo. Por ejemplo,
import numpy as np
import contextlib
@contextlib.contextmanager
def printoptions(*args, **kwargs):
original = np.get_printoptions()
np.set_printoptions(*args, **kwargs)
try:
yield
finally:
np.set_printoptions(**original)
x = np.random.random(10)
with printoptions(precision=3, suppress=True):
print(x)
# [ 0.073 0.461 0.689 0.754 0.624 0.901 0.049 0.582 0.557 0.348]
Para evitar que se eliminen ceros del final de los flotadores:
np.set_printoptions
ahora tiene un formatter
parámetro que le permite especificar una función de formato para cada tipo.
np.set_printoptions(formatter={'float': '{: 0.3f}'.format})
print(x)
que imprime
[ 0.078 0.480 0.413 0.830 0.776 0.102 0.513 0.462 0.335 0.712]
en lugar de
[ 0.078 0.48 0.413 0.83 0.776 0.102 0.513 0.462 0.335 0.712]
Úselo np.array_str
para aplicar formato a una sola declaración impresa. Proporciona un subconjunto de np.set_printoptions
la funcionalidad.
Por ejemplo:
In [27]: x = np.array([[1.1, 0.9, 1e-6]] * 3)
In [28]: print(x)
[[ 1.10000000e+00 9.00000000e-01 1.00000000e-06]
[ 1.10000000e+00 9.00000000e-01 1.00000000e-06]
[ 1.10000000e+00 9.00000000e-01 1.00000000e-06]]
In [29]: print(np.array_str(x, precision=2))
[[ 1.10e+00 9.00e-01 1.00e-06]
[ 1.10e+00 9.00e-01 1.00e-06]
[ 1.10e+00 9.00e-01 1.00e-06]]
In [30]: print(np.array_str(x, precision=2, suppress_small=True))
[[ 1.1 0.9 0. ]
[ 1.1 0.9 0. ]
[ 1.1 0.9 0. ]]
Unutbu dio una respuesta realmente completa (también obtuvieron un +1 de mi parte), pero aquí hay una alternativa de baja tecnología:
>>> x=np.random.randn(5)
>>> x
array([ 0.25276524, 2.28334499, -1.88221637, 0.69949927, 1.0285625 ])
>>> ['{:.2f}'.format(i) for i in x]
['0.25', '2.28', '-1.88', '0.70', '1.03']
Como función (usando la format()
sintaxis para formatear):
def ndprint(a, format_string ='{0:.2f}'):
print [format_string.format(v,i) for i,v in enumerate(a)]
Uso:
>>> ndprint(x)
['0.25', '2.28', '-1.88', '0.70', '1.03']
>>> ndprint(x, '{:10.4e}')
['2.5277e-01', '2.2833e+00', '-1.8822e+00', '6.9950e-01', '1.0286e+00']
>>> ndprint(x, '{:.8g}')
['0.25276524', '2.283345', '-1.8822164', '0.69949927', '1.0285625']
Se puede acceder al índice de la matriz en la cadena de formato:
>>> ndprint(x, 'Element[{1:d}]={0:.2f}')
['Element[0]=0.25', 'Element[1]=2.28', 'Element[2]=-1.88', 'Element[3]=0.70', 'Element[4]=1.03']
Para su información, Numpy 1.15 (fecha de lanzamiento pendiente) incluirá un administrador de contexto para configurar las opciones de impresión localmente . Esto significa que lo siguiente funcionará igual que el ejemplo correspondiente en la respuesta aceptada (por unutbu y Neil G) sin tener que escribir su propio administrador de contexto. Por ejemplo, usando su ejemplo:
x = np.random.random(10)
with np.printoptions(precision=3, suppress=True):
print(x)
# [ 0.073 0.461 0.689 0.754 0.624 0.901 0.049 0.582 0.557 0.348]