Imprima una matriz NumPy sin notación científica y con una precisión determinada

Resuelto camillio asked hace 14 años • 14 respuestas

¿Cómo imprimo matrices NumPy formateadas de una manera similar a esta?

x = 1.23456
print('%.3f' % x)

Si quiero imprimir los numpy.ndarraynú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.ndarrayaparentemente tiene que imprimirse como una cadena, es decir, con %s. ¿Existe alguna solucion para esto?

camillio avatar May 23 '10 19:05 camillio
Aceptado

Úselo numpy.set_printoptionspara 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 suppresssuprime 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.printoptionsadministrador de contexto. Por ejemplo, dentro de with-suite precision=3y suppress=Truese 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-suiteopciones 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_printoptionsahora tiene un formatterpará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]
unutbu avatar May 23 '2010 12:05 unutbu

Úselo np.array_strpara aplicar formato a una sola declaración impresa. Proporciona un subconjunto de np.set_printoptionsla 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. ]]
Daniel Golden avatar Jun 03 '2015 20:06 Daniel Golden

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']
Caleb Hattingh avatar Aug 17 '2013 10:08 Caleb Hattingh

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]
Justin Lanfranchi avatar Jun 18 '2018 21:06 Justin Lanfranchi