Comment imprimer le tableau NumPy complet, sans troncature?

589

Lorsque j'imprime un tableau numpy, j'obtiens une représentation tronquée, mais je veux le tableau complet.

Y a-t-il un moyen de faire ça?

Exemples:

>>> 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]])
kame
la source
18
Existe-t-il un moyen de le faire sur une base "ponctuelle"? Autrement dit, pour imprimer la sortie complète une fois, mais pas à d'autres moments dans le script?
tumultous_rooster
4
@Matt O'Brien voir la réponse de ZSG ci
user2398029
6
Pourriez-vous changer la réponse acceptée à celle qui recommande np.inf? np.nanet 'nan'ne fonctionne que par total fluke, et 'nan'ne fonctionne même pas en Python 3 car ils ont changé l'implémentation de comparaison de type mixte qui en threshold='nan'dépendait.
user2357112 prend en charge Monica
1
( threshold=np.nanplutôt que 'nan'dépend d'un autre hasard, c'est que la logique d'impression de la matrice compare la taille de la matrice au seuil avec a.size > _summaryThreshold. Cela revient toujours Falsepour _summaryThreshold=np.nan. Si la comparaison a été a.size <= _summaryThreshold, tester si la matrice doit être entièrement imprimée au lieu de tester être résumé, ce seuil déclencherait la récapitulation pour toutes les baies.)
user2357112 prend en charge Monica
4
Une façon "unique" de le faire: si vous avez tmpjuste un numpy.array list(tmp). D'autres options avec un formatage différent sont tmp.tolist()ou pour plus de contrôle print("\n".join(str(x) for x in tmp)).
travc

Réponses:

629

Utilisation numpy.set_printoptions:

import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)
Raja Selvaraj
la source
2
si vous ne souhaitez imprimer un numpytableau qu'une seule fois, cette solution a malheureusement l'inconvénient de vous obliger à réinitialiser ce changement de configuration après avoir effectué l'impression.
Trevor Boyd Smith
1
@TrevorBoydSmith, Savez-vous comment réinitialiser ce paramètre après l'impression?
ColinMac
1
@ColinMac voir stackoverflow.com/a/24542498/52074 où il enregistre les paramètres. fait une opération. restaure ensuite les paramètres.
Trevor Boyd Smith
1
Et comment le réinitialiser à la normale?
Gulzar
existe-t-il un moyen d'entrer manuellement la taille du seuil?
Amar Kumar
226
import numpy as np
np.set_printoptions(threshold=np.inf)

Je suggère d'utiliser np.infau lieu de np.nance qui est suggéré par d'autres. Ils fonctionnent tous les deux pour votre objectif, mais en définissant le seuil sur "infini", il est évident pour tout le monde qui lit votre code ce que vous voulez dire. Avoir un seuil de "pas un nombre" me semble un peu vague.

PaulMag
la source
15
Quelle est l'opération inverse de cela? Comment revenir au réglage précédent (avec les points)?
Karlo
9
@Karlo Le nombre par défaut est 1000, donc np.set_printoptions(threshold=1000)il reviendra au comportement par défaut. Mais vous pouvez définir ce seuil aussi bas ou haut que vous le souhaitez. np.set_printoptions(threshold=np.inf)modifie simplement la taille maximale qu'un tableau imprimé peut être avant d'être tronqué à l'infini, de sorte qu'il ne soit jamais tronqué, quelle que soit sa taille. Si vous définissez le seuil sur un nombre réel, ce sera la taille maximale.
PaulMag
8
Non seulement c'est plus clair, mais c'est beaucoup moins fragile. Il n'y a pas de traitement spécial pour np.inf, np.nanou 'nan'. Quoi que vous y mettiez, NumPy utilisera toujours un simple >pour comparer la taille du tableau à votre seuil. np.nanne fonctionne que parce que c'est au a.size > _summaryThresholdlieu de a.size <= _summaryThreshold, et np.nanretourne Falsepour toutes les comparaisons >/ </ >=/ <=. 'nan'ne fonctionne que du fait des détails d'implémentation fragiles de la logique de comparaison de type mixte de Python 2; il casse complètement sur Python 3.
user2357112 prend en charge Monica
2
Utilisez sys.maxsize car la valeur est documentée comme un int
mattip
2
Pour répondre correctement à la question de @ Karlo, notez que la valeur initiale du seuil des options d'impression se trouve dans np.get_printoptions()['threshold']. Vous pouvez stocker cette valeur avant de définir le seuil, puis la restaurer ensuite (ou utiliser un withbloc comme suggéré dans d'autres réponses).
Ninjakannon
94

Les réponses précédentes sont les bonnes, mais comme alternative plus faible, vous pouvez vous transformer en liste:

>>> 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]]
Anoyz
la source
14
Cela semble être la meilleure façon unique de voir votre tableau complet dans une déclaration d'impression.
Aaron Bramson
@AaronBramson je suis d'accord ... ceci est moins sujet aux erreurs lorsque vous avez besoin d'une seule instruction d'impression (une ligne de code au lieu de 3 lignes pour: changer la configuration, imprimer, réinitialiser la configuration).
Trevor Boyd Smith
J'aime que cela imprime les séparateurs par virgule
ObviousChild
58

NumPy 1.15 ou plus récent

Si vous utilisez NumPy 1.15 (publié le 2018-07-23) ou une version plus récente, vous pouvez utiliser le printoptionsgestionnaire de contexte:

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

(bien sûr, remplacez numpypar npsi c'est comme ça que vous avez importé numpy)

L'utilisation d'un gestionnaire de contexte (le with-bloc) garantit qu'après la fin du gestionnaire de contexte, les options d'impression reviendront à ce qu'elles étaient avant le démarrage du bloc. Il garantit que le paramètre est temporaire et appliqué uniquement au code dans le bloc.

Consultez la numpy.printoptionsdocumentation pour plus de détails sur le gestionnaire de contexte et les autres arguments qu'il prend en charge.

gerrit
la source
41

On dirait que vous utilisez numpy.

Si tel est le cas, vous pouvez ajouter:

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

Cela désactivera l'impression des coins. Pour plus d'informations, consultez ce didacticiel NumPy .

Reed Copsey
la source
4
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
Oui, cette partie du didacticiel officiel Numpy est erronée
aderchox
37

Voici une façon unique de le faire, ce qui est utile si vous ne souhaitez pas modifier vos paramètres par défaut:

def fullprint(*args, **kwargs):
  from pprint import pprint
  import numpy
  opt = numpy.get_printoptions()
  numpy.set_printoptions(threshold=numpy.inf)
  pprint(*args, **kwargs)
  numpy.set_printoptions(**opt)
ZSG
la source
13
On dirait que ce serait un bon endroit pour utiliser un gestionnaire de contexte, vous pouvez donc dire "avec fullprint".
Paul Price
8
Ne pas utiliser 'nan', np.nanou tout de ce qui précède. Ce n'est pas pris en charge, et ce mauvais conseil cause de la douleur aux personnes qui passent à python 3
Eric
1
@ZSG Remplacer la ligne 5 parnumpy.set_printoptions(threshold=numpy.inf)
Nirmal
Merci @Nirmal, j'ai édité cette réponse de 2014 pour qu'elle fonctionne aujourd'hui.
Paul Rougieux
31

Utiliser un gestionnaire de contexte comme l'a suggéré Paul Price

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)


if __name__ == '__main__': 
    a = np.arange(1001)

    with fullprint():
        print(a)

    print(a)

    with fullprint(threshold=None, edgeitems=10):
        print(a)
neok
la source
7
Ce gestionnaire de contexte est intégré à numpy 1.15, grâce à github.com/numpy/numpy/pull/10406 , sous le nomnp.printoptions
Eric
13

numpy.savetxt

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

ou si vous avez besoin d'une chaîne:

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

Le format de sortie par défaut est:

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

et il peut être configuré avec d'autres arguments.

Notez en particulier comment cela ne montre pas non plus les crochets et permet beaucoup de personnalisation, comme mentionné à: Comment imprimer un tableau Numpy sans crochets?

Testé sur Python 2.7.12, numpy 1.11.1.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
1
inconvénient mineur de cette méthode est que ne fonctionne qu'avec les tableaux 1d et 2d
Fnord
@Fnord merci pour cette info, faites-moi savoir si vous trouvez une solution de contournement!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10

Il s'agit d'une légère modification (suppression de l'option permettant de passer des arguments supplémentaires à la réponse set_printoptions)de neok .

Il montre comment vous pouvez utiliser contextlib.contextmanagerpour créer facilement un tel gestionnaire de contexte avec moins de lignes de code:

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)

Dans votre code, il peut être utilisé comme ceci:

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)
MSeifert
la source
1
Vous devez toujours mettre un try/ finallyautour de yielddans un gestionnaire de contexte, afin que le nettoyage se fasse quoi qu'il arrive.
Eric
1
@Eric en effet. Merci pour votre commentaire utile et j'ai mis à jour la réponse.
MSeifert
En 1.15, cela peut être orthographiéwith np.printoptions(threshold=np.inf):
Eric
6

En complément de cette réponse du nombre maximum de colonnes (fixé avec numpy.set_printoptions(threshold=numpy.nan)), il y a aussi une limite de caractères à afficher. Dans certains environnements, comme lors de l'appel de python à partir de bash (plutôt que dans la session interactive), cela peut être corrigé en définissant le paramètre linewidthcomme suit.

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)

Dans ce cas, votre fenêtre doit limiter le nombre de caractères pour boucler la ligne.

Pour ceux qui utilisent du texte sublime et souhaitent voir les résultats dans la fenêtre de sortie, vous devez ajouter l'option "word_wrap": falsede génération au fichier de construction sublime [ source ].

Traxidus Wolf
la source
4

Depuis la version 1.16 de NumPy, pour plus de détails, voir le ticket GitHub 12251 .

from sys import maxsize
from numpy import set_printoptions

set_printoptions(threshold=maxsize)
Velizar VESSELINOV
la source
4

Pour l'éteindre et revenir au mode normal

np.set_printoptions(threshold=False)
ewalel
la source
Cela fonctionne pour moi (Jupyter python version 3). Vous pouvez essayer le code ci-dessous. Selon la documentation officielle, le code ci-dessous devrait revenir aux options par défaut. Ce que cela a fait pour moi aussi. > np.set_printoptions (edgeitems = 3, infstr = 'inf', linewidth = 75, nanstr = 'nan', precision = 8, suppress = False, threshold = 1000, formatter = None)
ewalel
D'accord, ça doit être parce que je n'utilise pas Jupyter. Cependant, la réponse acceptée fonctionne pour moi dans un environnement python pur.
Mathyou
Cela signifie threshold=0, ce qui signifie "tronquer dès que possible" - pas ce que vous voulez du tout.
Eric
2

Supposons que vous ayez un tableau numpy

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

Si vous souhaitez imprimer le tableau complet de manière unique (sans basculer np.set_printoptions), mais que vous voulez quelque chose de plus simple (moins de code) que le gestionnaire de contexte, faites simplement

for row in arr:
     print row 
Mike Wojnowicz
la source
2

Une légère modification: (puisque vous allez imprimer une énorme liste)

import numpy as np
np.set_printoptions(threshold=np.inf, linewidth=200)

x = np.arange(1000)
print(x)

Cela augmentera le nombre de caractères par ligne (largeur de ligne par défaut de 75). Utilisez n'importe quelle valeur que vous aimez pour la largeur de ligne qui convient à votre environnement de codage. Cela vous évitera d'avoir à parcourir un grand nombre de lignes de sortie en ajoutant plus de caractères par ligne.

Gayal Kuruppu
la source
1

Vous pouvez utiliser la array2stringfonction - docs .

a = numpy.arange(10000).reshape(250,40)
print(numpy.array2string(a, threshold=numpy.nan, max_line_width=numpy.nan))
# [Big output]
Szymon Zmilczak
la source
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
1

Vous ne voudrez pas toujours que tous les éléments soient imprimés, en particulier pour les grands tableaux.

Un moyen simple de montrer plus d'articles:

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

Il fonctionne très bien lorsque la tranche est <1000 par défaut.

Robin Qiu
la source
0

Si vous avez des pandas disponibles,

    numpy.arange(10000).reshape(250,40)
    print(pandas.DataFrame(a).to_string(header=False, index=False))

évite l'effet secondaire d'exiger une réinitialisation de numpy.set_printoptions(threshold=sys.maxsize)et vous n'obtenez pas le numpy.array et les crochets. Je trouve cela pratique pour vider un large éventail dans un fichier journal

Ben
la source
-1

Si une matrice est trop grande pour être imprimée, NumPy ignore automatiquement la partie centrale de la matrice et imprime uniquement les coins: pour désactiver ce comportement et forcer NumPy à imprimer la totalité de la matrice, vous pouvez modifier les options d'impression à l'aide de 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)

Vous pouvez également vous référer à la documentation numpy pour "ou une partie" pour plus d'aide.

Arshdeep Singh
la source
3
Ne pas utiliser 'nan', np.nanou tout de ce qui précède. Ce n'est pas pris en charge, et ce mauvais conseil cause de la douleur aux personnes qui passent à python 3
Eric
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric