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]])
È stato utile?

Soluzione

numpy.set_printoptions :

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top