Cómo imprimir toda la gama NumPy, sin truncamiento?
-
22-09-2019 - |
Pregunta
Al imprimir una matriz numpy, me sale una representación truncada, pero quiero toda la gama.
¿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]])
Solución
import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)
Otros consejos
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 trabajan para su propósito, pero ajustando el umbral a "infinito" es obvio a todo el mundo la lectura de su código a qué se refiere. Tener un umbral de "no es un número" parece un poco vago para mí.
Las respuestas anteriores son las correctas, sino como una alternativa más débil que pueden transformarse 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]]
Esto suena como que está utilizando numpy.
Si ese es el caso, se puede añadir:
import numpy as np
np.set_printoptions(threshold=np.nan)
Esto desactivará la impresión de esquina. Para obtener más información, consulte esta NumPy Tutorial .
Aquí es un hecho aislado manera 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)
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):
kwargs.setdefault('threshold', np.inf)
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)
NumPy 1.15 o más reciente
Si utiliza NumPy 1.15 (publicado 23.07.2018) o posterior, puede utilizar el gestor de contexto printoptions
:
with numpy.printoptions(threshold=numpy.inf):
print(arr)
(por supuesto, sustituir numpy
por np
si así es como se importaron numpy
)
El uso de un gestor de contexto (el with
-bloque) asegura que después de que el gestor de contexto está terminado, las opciones de impresión volverá a lo que estaban antes de que comenzara el bloque. Asegura el ajuste es temporal, y solo se aplicará al código dentro del bloque.
numpy.printoptions
documentación para más información sobre el gestor de contexto y qué otros argumentos que soporta.
numpy.savetxt
numpy.savetxt(sys.stdout, numpy.arange(10000))
o si necesita una cadena:
import StringIO
sio = StringIO.StringIO()
numpy.savetxt(sio, numpy.arange(10000))
s = sio.getvalue()
print s
El formato de salida por defecto es:
0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
...
y se puede configurar con más argumentos.
Nota en particular, cómo esto tampoco muestra los corchetes, y permite una gran cantidad de personalización, como se mencionó en: Cómo imprimir una matriz numpy sin paréntesis?
Probado en Python 2.7.12, numpy 1.11.1.
Esta es una ligera modificación (eliminado la opción de pasar argumentos adicionales para set_printoptions)
of neok s respuesta.
Esto demuestra cómo se puede utilizar contextlib.contextmanager
para crear fácilmente como una ContextManager 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)
try:
yield
finally:
np.set_printoptions(**oldoptions)
En el código que puede ser utilizado como esto:
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)
complementaria a esta respuesta desde el número máximo de columnas (fijos con numpy.set_printoptions(threshold=numpy.nan)
), también hay un límite de caracteres para ser mostrado. En algunos entornos, como cuando se llama a pitón de fiesta (en lugar de la sesión interactiva), esto se puede solucionar mediante el establecimiento de la linewidth
parámetro de la siguiente manera.
import numpy as np
np.set_printoptions(linewidth=2000) # default = 75
Mat = np.arange(20000,20150).reshape(2,75) # 150 elements (75 columns)
print(Mat)
En este caso, la ventana debe limitar el número de caracteres para envolver la línea.
Para aquellos que por ahí el uso de texto sublime y con ganas de ver los resultados dentro de la ventana de salida, se debe añadir la opción de generación "word_wrap": false
al archivo sublime y construcción [ fuente ].
Para apagarlo y volver al modo normal
np.set_printoptions(threshold=False)
Suponga que tiene una matriz numpy
arr = numpy.arange(10000).reshape(250,40)
Si desea imprimir toda la gama en un camino de una sola vez (sin alternar np.set_printoptions), pero si quieres algo más simple (menos código) que el gestor de contexto, acaba de hacer
for row in arr:
print row
Puede utilizar la función array2string
- docs .
a = numpy.arange(10000).reshape(250,40)
print(numpy.array2string(a, threshold=numpy.nan, max_line_width=numpy.nan))
# [Big output]
Desde NumPy versión 1.16, para más detalles ver billete GitHub 12251 .
from sys import maxsize
from numpy import set_printoptions
set_printoptions(threshold=maxsize)
no siempre desea que todos los elementos impresos, especialmente para las grandes matrices.
Una forma sencilla de mostrar más elementos:
In [349]: ar
Out[349]: array([1, 1, 1, ..., 0, 0, 0])
In [350]: ar[:100]
Out[350]:
array([1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1,
1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1])
Trabaja muy bien al corte array <1,000 por defecto.
Si una matriz es demasiado grande para ser impreso, NumPy salta automáticamente la parte central de la matriz y sólo imprime las esquinas:
Para desactivar este comportamiento y forzar NumPy para imprimir toda la matriz, puede cambiar las opciones de impresión que utiliza set_printoptions
.
>>> np.set_printoptions(threshold='nan')
o
>>> np.set_printoptions(edgeitems=3,infstr='inf',
... linewidth=75, nanstr='nan', precision=8,
... suppress=False, threshold=1000, formatter=None)
También puede referirse a la numpy documentación numpy documentación "o parte" para obtener más ayuda.