2010-01-01 13 views
284

Cuando imprimo una matriz numpy, obtengo una representación truncada, pero quiero la matriz completa.¿Cómo imprimir todo el conjunto de NumPy?

¿Hay alguna manera de hacer esto?

Ejemplos:

>>> numpy.arange(10000) 
array([ 0, 1, 2, ..., 9997, 9998, 9999]) 
>>> numpy.arange(10000).reshape(250,40) 
array([[ 0, 1, 2, ..., 37, 38, 39], 
     [ 40, 41, 42, ..., 77, 78, 79], 
     [ 80, 81, 82, ..., 117, 118, 119], 
     ..., 
     [9880, 9881, 9882, ..., 9917, 9918, 9919], 
     [9920, 9921, 9922, ..., 9957, 9958, 9959], 
     [9960, 9961, 9962, ..., 9997, 9998, 9999]]) 
+6

¿hay una manera de hacerlo de forma "excepcional" Th? at is, para imprimir la salida completa una vez, pero no en otras ocasiones en el script? –

+2

@Matt O'Brien ver la respuesta de ZSG debajo de – user2398029

+3

¿Podría cambiar la respuesta aceptada por la que recomienda 'np.inf'? 'np.nan' y''nan'' solo funcionan por casualidad total, y [''nan'' ni siquiera funciona en Python 3] (http://ideone.com/tjyGhX) porque cambiaron la mezcla tipo implementación de comparación de la que dependía 'threshold = 'nan''. – user2357112

Respuesta

302

Para aclarar sobre la respuesta de Reed

import numpy 
numpy.set_printoptions(threshold=numpy.nan) 

Tenga en cuenta que la respuesta que ha dado anteriormente funciona con una inicial 'de importación numpy *', que no es aconsejable. Esto también funciona para mí

numpy.set_printoptions(threshold='nan') 

Para obtener la documentación completa, vea http://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html.

+15

Para el principiante, los mensajes de error como 'TypeError: tipos no pedidos: int()> str()' no son un diagnóstico muy claro; se producen si usa 'import numpy as np', pero se olvida de ponerle un prefijo a la definición del umbral con' np'. Por lo tanto, para aclarar, si 'importas numpy como X' necesitas especificar el umbral como 'X.nan' o' X .inf'. Por ejemplo, 'import numpy as np' requiere' np.set_printoptions (threshold = np.nan) '. –

+7

Para mí el ajuste 'threshold = 'nan'' no funcionó. Configurar 'threshold = np.inf' funciona como lo sugiere @PaulMag – Shamps

+1

@Shamps Same here. Después de establecer 'threshold = 'nan'', no se imprime nada. Con 'np.inf' todo está impreso. – Karlo

35

esto suena como que está utilizando numpy.

Si ese es el caso, se puede añadir:

import numpy as np 
np.set_printoptions(threshold='nan') 

que desactiva la impresión de esquina. Para obtener más información, consulte este NumPy Tutorial.

+4

Tenga en cuenta que creo que necesita ya sea 'threshold = 'nan'' (es decir, comillas alrededor de' nan'), o tiene que importar la constante: 'from numpy import nan' – charleslparker

27

Aquí es una forma de una sola vez de hacer esto, lo cual es útil si no desea cambiar la configuración por defecto:

def fullprint(*args, **kwargs): 
    from pprint import pprint 
    import numpy 
    opt = numpy.get_printoptions() 
    numpy.set_printoptions(threshold='nan') 
    pprint(*args, **kwargs) 
    numpy.set_printoptions(**opt) 
+8

Parece que este sería un buen lugar para usar un administrador de contexto, por lo que puede decir "con impresión completa". –

121
import numpy as np 
np.set_printoptions(threshold=np.inf) 

sugiere emplear np.inf en lugar de np.nan que se sugiere por otros. Ambos funcionan para su propósito, pero al establecer el umbral en "infinito", es obvio para todos los que leen su código lo que quiere decir. Tener un umbral de "no un número" me parece un poco vago.

+2

¿Cuál es la operación inversa de esto? ¿Cómo volver a la configuración anterior (con los puntos)? – Karlo

+4

@Karlo El número predeterminado es 1000, por lo que 'np.set_printoptions (threshold = 1000)' lo revertirá al comportamiento predeterminado. Pero puede establecer este umbral tan bajo o alto como desee. 'np.set_printoptions (threshold = np.inf)' simplemente cambia el tamaño máximo que puede tener una matriz impresa antes de que se trunque a infinito, de modo que nunca se trunque sin importar cuán grande sea. Si establece el umbral en cualquier número real, ese será el tamaño máximo. – PaulMag

+4

No solo es más claro, es mucho menos frágil. No hay ** manejo especial ** para 'np.inf',' np.nan', o ''nan''. Lo que sea que pongas allí, NumPy seguirá usando un '' 'simple para comparar el tamaño de la matriz con tu umbral. 'np.nan' solo funciona porque es' a.size> _summaryThreshold' en lugar de 'a.size <= _summaryThreshold', y' np.nan' devuelve 'False' para todos'> '/' <'/'> = '/ '<=' comparaciones. "Nan" solo funciona debido a los detalles de implementación frágiles de la lógica de comparación de tipo mixto de Python 2; se rompe completamente en Python 3. – user2357112

29

Las respuestas anteriores son las correctas, sino como una alternativa weeker se puede transformar en una lista:

>>> numpy.arange(100).reshape(25,4).tolist() 

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 
22, 23], [24, 25, 26, 27], [28, 29, 30, 31], [32, 33, 34, 35], [36, 37, 38, 39], [40, 41, 
42, 43], [44, 45, 46, 47], [48, 49, 50, 51], [52, 53, 54, 55], [56, 57, 58, 59], [60, 61, 
62, 63], [64, 65, 66, 67], [68, 69, 70, 71], [72, 73, 74, 75], [76, 77, 78, 79], [80, 81, 
82, 83], [84, 85, 86, 87], [88, 89, 90, 91], [92, 93, 94, 95], [96, 97, 98, 99]] 
15

El uso de un gestor de contexto como Paul Price sugggested

import numpy as np 


class fullprint: 
    'context manager for printing full numpy arrays' 

    def __init__(self, **kwargs): 
     if 'threshold' not in kwargs: 
      kwargs['threshold'] = np.nan 
     self.opt = kwargs 

    def __enter__(self): 
     self._opt = np.get_printoptions() 
     np.set_printoptions(**self.opt) 

    def __exit__(self, type, value, traceback): 
     np.set_printoptions(**self._opt) 

a = np.arange(1001) 

with fullprint(): 
    print(a) 

print(a) 

with fullprint(threshold=None, edgeitems=10): 
    print(a) 
+3

Es un uso inteligente de un administrador de contexto. – timgeb

8

numpy.savetxt

numpy.savetxt(sys.stdout, numpy.arange(10000)) 

o si necesita una cadena: formato de salida

import StringIO 
sio = StringIO.StringIO() 
numpy.savetxt(sio, numpy.arange(10000)) 
s = sio.getvalue() 
print s 

El valor por defecto es:

0.000000000000000000e+00 
1.000000000000000000e+00 
2.000000000000000000e+00 
3.000000000000000000e+00 
... 

y se puede configurar con más argumentos.

Probado en Python 2.7.12, numpy 1.11.1.

5

Para aquellos que gustan de importar, como NP:

import numpy as np 
np.set_printoptions(threshold=np.nan) 

También trabajará

0

Si una matriz es demasiado grande para ser impreso, NumPy salta automáticamente la parte central de la matriz y sólo imprime el esquinas: para desactivar este comportamiento y la fuerza NumPy para imprimir toda la matriz, puede cambiar las opciones de impresión utilizando set_printoptions.

>>> np.set_printoptions(threshold='nan') 

          ***or*** 
    >>> np.set_printoptions(edgeitems=3,infstr='inf', 
... linewidth=75, nanstr='nan', precision=8, 
... suppress=False, threshold=1000, formatter=None) 

también puede reffer numpy documentationnumpy documentation for "or part" para obtener más ayuda

-3

su gama al igual que del pitón, utilice np.range(10001) bienvenidos !! .

4

Ésta es una ligera modificación (eliminado la opción de pasar argumentos adicionales a set_printoptions) de neok s respuesta

Se muestra cómo se puede utilizar contextlib.contextmanager para crear fácilmente un ContextManager este tipo con menos líneas de código:

import numpy as np 
from contextlib import contextmanager 

@contextmanager 
def show_complete_array(): 
    oldoptions = np.get_printoptions() 
    np.set_printoptions(threshold=np.inf) 
    yield 
    np.set_printoptions(**oldoptions) 

en su código puede ser utilizado de esta manera:

a = np.arange(1001) 

print(a)  # shows the truncated array 

with show_complete_array(): 
    print(a) # shows the complete array 

print(a)  # shows the truncated array (again) 
+0

Esto es fantástico, agradable y corto, y funciona muy bien. – Korzak

Cuestiones relacionadas