2010-01-01 14 views
284

Lorsque j'imprime un tableau numpy, j'obtiens une représentation tronquée, mais je veux le tableau complet.Comment imprimer la matrice NumPy complète?

Y at-il un moyen de le faire?

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

est-il possible de le faire sur une base « d'une off » Th? at est, pour imprimer la sortie complète une fois, mais pas à d'autres moments dans le script? –

+2

@Matt O'Brien voir la réponse de ZSG ci-dessous – user2398029

+3

Pourriez-vous changer la réponse acceptée à celle qui recommande 'np.inf'? 'np.nan' et''nan 'ne fonctionnent que par fluke total, et ['' nan'' ne fonctionne même pas en Python 3] (http://ideone.com/tjyGhX) parce qu'ils ont changé le mélange- implémentation de comparaison de type sur laquelle dépendait 'threshold = 'nan''. – user2357112

Répondre

302

Pour clarifier sur la réponse de Reed

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

Notez que la réponse donnée comme ci-dessus fonctionne avec un premier « de * l'importation numpy », ce qui est souhaitable. Cela fonctionne aussi pour moi

numpy.set_printoptions(threshold='nan') 

Pour une documentation complète, voir http://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html.

+15

Au novice, les messages d'erreur tels que 'TypeError: types non classables: int()> str()' ne sont pas un diagnostic très clair; ils se produisent si vous utilisez 'numpy import np' mais oubliez de préfixer votre définition de seuil avec' np.' Donc, pour clarifier, si vous 'importez numpy comme X' vous devez spécifier le seuil comme 'X.nan' ou' X .inf'. Par exemple, 'import numpy as np' nécessite' np.set_printoptions (seuil = np.nan) '. –

+7

Pour moi, le réglage 'threshold = 'nan'' n'a pas fonctionné. La définition de 'threshold = np.inf' fonctionne comme suggéré par @PaulMag – Shamps

+1

@Shamps Même ici. Après avoir défini 'threshold = 'nan'', rien n'est imprimé. Avec 'np.inf' tout est imprimé. – Karlo

35

Cela sonne comme vous utilisez numpy.

Si tel est le cas, vous pouvez ajouter:

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

qui désactive l'impression d'angle. Pour plus d'informations, voir ce NumPy Tutorial.

+4

Notez que je crois que vous avez besoin de 'threshold = 'nan'' (c'est-à-dire, les guillemets autour de' nan'), ou vous devez importer la constante: 'de numpy import nan' – charleslparker

27

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

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

On dirait que ce serait un bon endroit pour utiliser un gestionnaire de contexte, donc vous pouvez dire "avec fullprint". –

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

Je suggère d'utiliser np.inf au lieu de np.nan qui est suggéré par d'autres. Ils travaillent tous les deux pour votre but, mais en définissant le seuil à «l'infini», il est évident pour tout le monde en lisant votre code ce que vous voulez dire. Avoir un seuil de "pas un nombre" me semble un peu vague.

+2

Quelle est l'opération inverse de cela? Comment revenir au réglage précédent (avec les points)? – Karlo

+4

@Karlo Le nombre par défaut est 1000, donc 'np.set_printoptions (threshold = 1000)' rétablira le 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)' change simplement la taille maximale d'un tableau imprimé avant qu'il ne soit 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

+4

Non seulement c'est plus clair, mais c'est beaucoup moins fragile. Il n'y a pas ** de manipulation spéciale pour "np.inf", "np.nan", ou "nan". Quoi que vous y mettiez, NumPy utilisera toujours un '>' pour comparer la taille du tableau à votre seuil. 'np.nan' ne fonctionne que parce que c'est' a.size> _summaryThreshold' au lieu de 'a.size <= _summaryThreshold', et' np.nan' renvoie 'False' pour tout' '' ''/'<'/'> ='/'<=' comparaisons. '' nan'' n'arrive à fonctionner que grâce à 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

29

Les réponses précédentes sont les bonnes, mais comme une alternative weeker vous pouvez transformer en une 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]] 
15

L'utilisation d'un gestionnaire de contexte que 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

C'est une utilisation intelligente d'un gestionnaire de contexte. – timgeb

8

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.

Testé sur Python 2.7.12, numpy 1.11.1.

5

Pour ceux qui aiment importer comme np:

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

Sera également travailler

0

Si un tableau est trop grand pour être imprimé, NumPy saute automatiquement la partie centrale du tableau et imprime seulement coins: pour désactiver ce comportement et la force NumPy pour imprimer le tableau entier, vous pouvez modifier les options d'impression à l'aide 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) 

vous pouvez aussi reffer numpy documentationnumpy documentation for "or part" pour plus d'aide

-3

sa gamme est comme python, utilisez np.range(10001) bienvenue !! .

4

Ceci est une légère modification (supprimé la possibilité de passer des arguments supplémentaires à set_printoptions) de neok de réponse

Il montre comment vous pouvez utiliser contextlib.contextmanager pour créer facilement un tel ContextManager 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) 
    yield 
    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) 
+0

C'est fantastique, agréable et court et fonctionne très bien. – Korzak

Questions connexes