2010-01-01 12 views
284

Quando stampo una matrice numpy, ottengo una rappresentazione troncata, ma voglio l'array completo.Come stampare l'intero array NumPy?

C'è un modo per farlo?

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]]) 
+6

c'è un modo per farlo su una base "una tantum" Th? a è, per stampare l'output completo una volta, ma non in altre volte nella sceneggiatura? –

+2

@Matt O'Brien vedere la risposta di ZSG sotto – user2398029

+3

Potresti cambiare la risposta accettata a quella che consiglia 'np.inf'? 'np.nan' e' 'nan'' funzionano solo per fluke totale e ['' nan'' non funziona nemmeno in Python 3] (http://ideone.com/tjyGhX) perché hanno cambiato il mix tipo confronto implementazione che 'soglia = 'nan'' dipendeva da. – user2357112

risposta

302

Per chiarire sulla risposta di Reed

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

Si noti che la risposta come indicato sopra funziona con un iniziale 'dal NumPy import *', che non è consigliabile. Questo funziona anche per me

numpy.set_printoptions(threshold='nan') 

Per la documentazione completa, vedere http://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html.

+15

Per i principianti, messaggi di errore come 'TypeError: tipi non ordinabili: int()> str()' non è una diagnosi molto chiara; si verificano se si utilizza 'import numpy come np', ma si dimentica di aggiungere un prefisso alla definizione della soglia con' np'. Quindi, per chiarire, se si importa 'numpy come X', è necessario specificare la soglia come' X.nan' o 'X .inf'. Ad esempio, 'import numpy as np' richiede' np.set_printoptions (threshold = np.nan) '. –

+7

Per me l'impostazione 'threshold = 'nan'' non ha funzionato. L'impostazione di 'threshold = np.inf' funziona come suggerito da @PaulMag – Shamps

+1

@Shamps Lo stesso qui. Dopo aver impostato 'threshold = 'nan'', non viene stampato nulla. Con 'np.inf' tutto è stampato. – Karlo

35

Questo suona come si sta utilizzando NumPy.

Se questo è il caso, è possibile aggiungere:

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

che consente di disattivare la stampa angolo. Per ulteriori informazioni, vedere questo NumPy Tutorial.

+4

Nota che credo che sia necessario 'threshold = 'nan'' (ovvero virgolette attorno a' nan'), oppure devi importare la costante: 'from numpy import nan' – charleslparker

27

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) 
+8

Sembra che questo sia un buon posto per usare un gestore di contesto, quindi puoi dire "con fullprint". –

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

Io suggerisco di usare np.inf invece di np.nan che è suggerita dagli altri. Entrambi funzionano per il tuo scopo, ma impostando la soglia su "infinito" è ovvio per tutti che leggono il tuo codice cosa intendi. Avere una soglia di "non un numero" mi sembra un po 'vaga.

+2

Qual è l'operazione inversa di questo? Come tornare all'impostazione precedente (con i punti)? – Karlo

+4

@Karlo Il numero predefinito è 1000, quindi 'np.set_printoptions (threshold = 1000)' lo ripristinerà al comportamento predefinito. Ma puoi impostare questa soglia al livello più basso o alto che desideri. 'np.set_printoptions (threshold = np.inf)' cambia semplicemente la dimensione massima che può essere una matrice stampata prima che sia troncata all'infinito, in modo che non venga mai troncata, non importa quanto grande. Se imposti la soglia su qualsiasi numero reale, allora quella sarà la dimensione massima. – PaulMag

+4

Non solo è più chiaro, è molto meno fragile. Non esiste ** alcuna gestione speciale ** per 'np.inf',' np.nan' o ''nan''. Qualunque cosa tu abbia messo lì, NumPy userà ancora un semplice '>' per confrontare la dimensione dell'array alla tua soglia. 'np.nan' funziona solo perché è' a.size> _summaryThreshold' invece di 'a.size <= _summaryThreshold', e' np.nan' restituisce 'False' per tutti'> '/' <'/'> = '/ '<=' confronti. ''nan'' funziona solo a causa di dettagli di implementazione delicati della logica di confronto di tipo misto di Python 2; si rompe completamente su Python 3. – user2357112

29

Le risposte precedenti sono quelli corretti, ma come un weeker alternativa 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]] 
15

attraverso un gestore di contesto, come 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

Questo è un uso intelligente di un gestore di contesto. – timgeb

8

numpy.savetxt

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

o se avete bisogno di una stringa: formato di output

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

Il valore predefinito è:

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

e può essere configurato con ulteriori argomenti.

Testato su Python 2.7.12, NumPy 1.11.1.

5

Per coloro che amano importare come np:

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

Sarà anche lavorare

0

Se un array è troppo grande per essere stampata, NumPy salta automaticamente la parte centrale della matrice e stampa solo il 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') 

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

è anche possibile reffer numpy documentationnumpy documentation for "or part" per ulteriori informazioni

-3

sua gamma proprio come di pitone, utilizzare np.range(10001) benvenuto !! .

4

Questa è una leggera modifica (rimosso la possibilità di passare gli argomenti aggiuntivi per set_printoptions) di neok s risposta

Essa mostra come è possibile utilizzare contextlib.contextmanager per 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) 
    yield 
    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) 
+0

Questo è fantastico, bello e breve e funziona davvero bene. – Korzak