Come stampare la gamma completa NumPy, senza troncamento?
-
22-09-2019 - |
Domanda
Quando stampo un array di NumPy, ottengo una rappresentazione troncata, ma voglio la serie completa.
Esiste un modo per fare questo?
Esempi:
>>> 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]])
Soluzione
import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)
Altri suggerimenti
import numpy as np
np.set_printoptions(threshold=np.inf)
Suggerisco usando np.inf
invece di np.nan
che è suggerita da altri. Entrambi lavorano per il vostro scopo, ma impostando la soglia di "infinito" è evidente a tutti di leggere il tuo codice di quello che vuoi dire. Avere una soglia di "non un numero" sembra un po 'vago per me.
Le risposte precedenti sono quelli corretti, ma come un'alternativa più debole si può trasformare in un elenco:
>>> 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]]
Questo suona come si sta utilizzando NumPy.
Se questo è il caso, è possibile aggiungere:
import numpy as np
np.set_printoptions(threshold=np.nan)
che consente di disattivare la stampa angolo. Per ulteriori informazioni, consultare questo NumPy Tutorial .
Ecco un modo una tantum per fare questo, che è utile se non si desidera modificare le impostazioni predefinite:
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)
Utilizzo di un gestore di contesto, come Paolo Prezzo 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 più recente
Se si utilizza NumPy 1.15 (rilasciata 2018/07/23) o più recente, è possibile utilizzare il gestore di contesto printoptions
:
with numpy.printoptions(threshold=numpy.inf):
print(arr)
(ovviamente, sostituire numpy
da np
se è così che è stato importato numpy
)
L'uso di un gestore di contesto (la with
-blocco) assicura che dopo il manager contesto è terminata, le opzioni di stampa torneranno a tutto ciò che erano prima del blocco iniziato. Assicura l'impostazione è temporanea, e applicato solo al codice all'interno del blocco.
numpy.printoptions
documentazione dettagli sul contesto responsabile e quali altri argomenti supporta.
numpy.savetxt
numpy.savetxt(sys.stdout, numpy.arange(10000))
o se avete bisogno di una stringa:
import StringIO
sio = StringIO.StringIO()
numpy.savetxt(sio, numpy.arange(10000))
s = sio.getvalue()
print s
Il formato di output predefinito è:
0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
...
e può essere configurato con ulteriori argomenti.
Si noti in particolare come questo, inoltre, non mostra le parentesi quadre, e permette per un sacco di personalizzazione, come accennato in: Come stampare una matrice Numpy senza parentesi?
Testato su Python 2.7.12, NumPy 1.11.1.
Questa è una leggera modifica (rimosso la possibilità di passare argomenti aggiuntivi per set_printoptions)
of neok s risposta.
Si mostra come è possibile utilizzare contextlib.contextmanager
di creare facilmente una tale contextmanager con un minor numero di righe di codice:
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)
Nel codice può essere utilizzato in questo modo:
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)
Per completare tale rispondere dal numero massimo di colonne (fisse con numpy.set_printoptions(threshold=numpy.nan)
), v'è anche un limite di caratteri per essere visualizzato. In alcuni ambienti, come quando si chiama Python da bash (piuttosto che la sessione interattiva), questo può essere risolto impostando il parametro linewidth
come segue.
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)
In questo caso, la finestra dovrebbe limitare il numero di caratteri per avvolgere la linea.
Per quelli là fuori utilizzando il testo sublime e che vogliono vedere i risultati entro la finestra di output, si dovrebbe aggiungere l'opzione di compilazione "word_wrap": false
al file sublime-build [ fonte ].
Per spegnerlo e tornare alla modalità normale
np.set_printoptions(threshold=False)
Si supponga di avere una matrice NumPy
arr = numpy.arange(10000).reshape(250,40)
Se si desidera stampare la gamma completa in maniera una tantum (senza commutazione np.set_printoptions), ma vuole qualcosa di più semplice (meno codice) rispetto al contesto manager, basta fare
for row in arr:
print row
È possibile utilizzare la funzione array2string
- docs .
a = numpy.arange(10000).reshape(250,40)
print(numpy.array2string(a, threshold=numpy.nan, max_line_width=numpy.nan))
# [Big output]
Dal NumPy versione 1.16, per maggiori dettagli vedere biglietto GitHub 12251 .
from sys import maxsize
from numpy import set_printoptions
set_printoptions(threshold=maxsize)
Non si vuole sempre tutti gli elementi stampati, in particolare per i grandi array.
Un modo semplice per mostrare più elementi:
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])
Funziona bene quando a fette array <1.000 per impostazione predefinita.
Se un array è troppo grande per essere stampata, NumPy salta automaticamente la parte centrale della matrice e stampa solo gli angoli:
Per disattivare questo comportamento e la forza NumPy per stampare l'intero array, è possibile modificare le opzioni di stampa utilizzando 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)
Si può anche fare riferimento alla numpy documentazione NumPy documentazione per "o di parte" per ulteriori informazioni.