Pergunta

Quando imprimir uma matriz Numpy, recebo uma representação truncada, mas quero a matriz completa.

Há alguma maneira de fazer isso?

Exemplos:

>>> 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]])
Foi útil?

Solução

Usar numpy.set_printoptions:

import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)

Outras dicas

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

Eu sugiro usar np.inf ao invés de np.nan o que é sugerido por outros. Ambos trabalham para o seu propósito, mas, ao definir o limite para o "infinito", é óbvio para todos que leem seu código o que você quer dizer. Ter um limiar de "não um número" parece um pouco vago para mim.

As respostas anteriores são as corretas, mas como uma alternativa mais fraca, você pode se transformar em uma 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]]

Parece que você está usando Numpy.

Se for esse o caso, você pode adicionar:

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

Isso desativará a impressão de canto. Para mais informações, veja isso Tutorial Numpy.

Aqui está uma maneira única de fazer isso, o que é útil se você não quiser alterar suas configurações padrão:

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)

Usando um gerente de contexto como Paul Price sugerido

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 ou mais recente

Se você usar o Numpy 1.15 (lançado 2018-07-23) ou mais recente, poderá usar o printoptions Gerente de contexto:

with numpy.printoptions(threshold=numpy.inf):
    print(arr)

(Claro, substitua numpy por np Se é assim que você importou numpy)

O uso de um gerente de contexto (o with-Block) garante que, após o término do gerenciador de contexto, as opções de impressão revertem para o que fossem antes do início do bloco. Ele garante que a configuração seja temporária e aplicada apenas ao código dentro do bloco.

Ver numpy.printoptions documentação Para detalhes sobre o gerenciador de contexto e quais outros argumentos ele suporta.

numpy.savetxt

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

ou se você precisar de uma string:

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

O formato de saída padrão é:

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

e pode ser configurado com outros argumentos.

Observe em particular como isso também não mostra os colchetes e permite muita personalização, conforme mencionado em: Como imprimir uma matriz Numpy sem colchetes?

Testado no Python 2.7.12, Numpy 1.11.1.

Esta é uma pequena modificação (removida a opção de transmitir argumentos adicionais para set_printoptions)do Neoks resposta.

Mostra como você pode usar contextlib.contextmanager Para criar facilmente esse manager de contexto com menos linhas 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)

No seu código, ele pode ser usado assim:

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)

Complementar a isso responda do número máximo de colunas (corrigido com numpy.set_printoptions(threshold=numpy.nan)), há também um limite de caracteres a serem exibidos. Em alguns ambientes, como chamando Python da Bash (em vez da sessão interativa), isso pode ser corrigido definindo o parâmetro linewidth como 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)

Nesse caso, sua janela deve limitar o número de caracteres para envolver a linha.

Para aqueles que estão por aí usando texto sublime e querendo ver os resultados na janela de saída, você deve adicionar a opção de compilação "word_wrap": false para o arquivo sublime-build [fonte] .

Para desligá -lo e retornar ao modo normal

np.set_printoptions(threshold=False)

Suponha que você tenha uma matriz numpy

 arr = numpy.arange(10000).reshape(250,40)

Se você deseja imprimir a matriz completa de uma maneira única (sem alternar o np.set_printoptions), mas quer algo mais simples (menos código) do que o gerenciador de contexto, basta fazer

for row in arr:
     print row 

Você pode usar o array2string função - documentos.

a = numpy.arange(10000).reshape(250,40)
print(numpy.array2string(a, threshold=numpy.nan, max_line_width=numpy.nan))
# [Big output]

Desde o Numpy versão 1.16, para mais detalhes, consulte Bilhete do GitHub 12251.

from sys import maxsize
from numpy import set_printoptions

set_printoptions(threshold=maxsize)

Você nem sempre deseja que todos os itens impressos, especialmente para grandes matrizes.

Uma maneira simples de mostrar mais itens:

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

Funciona bem quando matou a matriz <1000 por padrão.

Se uma matriz for muito grande para ser impressa, Numpy pula automaticamente a parte central da matriz e imprime apenas os cantos: para desativar esse comportamento e forçar o Numpy a imprimir toda a matriz, você pode alterar as opções de impressão usando set_printoptions.

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

ou

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

Você também pode se referir ao Documentação Numpy documentação numpy para "ou parte" Para mais ajuda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top