Wie drucke ich das gesamte NumPy-Array ohne Kürzung?

589

Wenn ich ein numpy-Array drucke, erhalte ich eine abgeschnittene Darstellung, aber ich möchte das vollständige Array.

Gibt es eine Möglichkeit, dies zu tun?

Beispiele:

>>> 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
quelle
18
Gibt es eine Möglichkeit, dies einmalig zu tun? Das heißt, die vollständige Ausgabe einmal auszudrucken, aber nicht zu anderen Zeiten im Skript?
tumultous_rooster
4
@ Matt O'Brien siehe ZSGs Antwort unten
user2398029
6
Könnten Sie die akzeptierte Antwort in die empfohlene ändern np.inf? np.nanund 'nan'funktionieren nur per Zufall und 'nan'nicht einmal in Python 3, da sie die Vergleichsimplementierung threshold='nan'vom gemischten Typ geändert haben, die davon abhängt.
user2357112 unterstützt Monica
1
( threshold=np.nananstatt 'nan'von einem anderen Zufall abzuhängen, dh, dass die Array-Drucklogik die Array-Größe mit dem Schwellenwert vergleicht a.size > _summaryThreshold. Dies gibt immer Falsefür zurück _summaryThreshold=np.nan. Wenn der Vergleich gewesen wäre a.size <= _summaryThreshold, testen Sie, ob das Array vollständig gedruckt werden sollte, anstatt zu testen, ob es sollte Zusammenfassend würde dieser Schwellenwert eine Zusammenfassung für alle Arrays auslösen.)
user2357112 unterstützt Monica am
4
Ein „one-off“ Art und Weise , es zu tun: Wenn Sie einen numpy.array haben tmpgerade list(tmp). Andere Optionen mit unterschiedlicher Formatierung sind tmp.tolist()oder für mehr Kontrolle print("\n".join(str(x) for x in tmp)).
Reise

Antworten:

629

Verwendung numpy.set_printoptions:

import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)
Raja Selvaraj
quelle
2
Wenn Sie ein numpyArray nur einmal drucken möchten , hat diese Lösung leider den Nachteil, dass Sie diese Konfigurationsänderung nach dem Drucken zurücksetzen müssen.
Trevor Boyd Smith
1
@TrevorBoydSmith, wissen Sie, wie Sie diesen Parameter nach dem Druck zurücksetzen können?
ColinMac
1
@ColinMac siehe stackoverflow.com/a/24542498/52074, wo er die Einstellungen speichert. macht eine Operation. stellt dann die Einstellungen wieder her.
Trevor Boyd Smith
1
Und wie kann man es wieder normalisieren?
Gulzar
Gibt es eine Möglichkeit, die Schwellengröße manuell einzugeben?
Amar Kumar
226
import numpy as np
np.set_printoptions(threshold=np.inf)

Ich schlage vor, np.infstattdessen zu verwenden, np.nanwas von anderen vorgeschlagen wird. Beide arbeiten für Ihren Zweck, aber wenn Sie den Schwellenwert auf "unendlich" setzen, ist es für jeden, der Ihren Code liest, offensichtlich, was Sie meinen. Eine Schwelle von "keine Zahl" zu haben, scheint mir ein wenig vage zu sein.

PaulMag
quelle
15
Was ist die umgekehrte Operation davon? Wie kehre ich zur vorherigen Einstellung zurück (mit den Punkten)?
Karlo
9
@Karlo Die Standardnummer ist 1000, daher np.set_printoptions(threshold=1000)wird das Standardverhalten wiederhergestellt . Sie können diesen Schwellenwert jedoch so niedrig oder hoch einstellen, wie Sie möchten. np.set_printoptions(threshold=np.inf)Ändert einfach die maximale Größe eines gedruckten Arrays, bevor es auf unendlich abgeschnitten wird, sodass es niemals abgeschnitten wird, egal wie groß es ist. Wenn Sie den Schwellenwert auf eine reelle Zahl einstellen, ist dies die maximale Größe.
PaulMag
8
Dies ist nicht nur klarer, es ist auch viel weniger zerbrechlich. Es gibt keine spezielle Behandlung für np.inf, np.nanoder 'nan'. Was auch immer Sie dort ablegen, NumPy verwendet weiterhin eine Ebene >, um die Größe des Arrays mit Ihrem Schwellenwert zu vergleichen. np.nanfunktioniert nur, weil es a.size > _summaryThresholdstatt ist a.size <= _summaryThreshold, und np.nangibt Falsefür alle >/ </ >=/ <=Vergleiche zurück. 'nan'funktioniert nur aufgrund fragiler Implementierungsdetails der gemischten Vergleichslogik von Python 2; es bricht vollständig auf Python 3.
user2357112 unterstützt Monica
2
Verwenden Sie sys.maxsize, da der Wert als int
mattip
2
Um die Frage von @ Karlo richtig zu beantworten, beachten Sie, dass der Anfangswert für den Druckoptionsschwellenwert in gefunden wird np.get_printoptions()['threshold']. Sie können diesen Wert speichern, bevor Sie den Schwellenwert festlegen, und ihn anschließend wiederherstellen (oder einen withBlock verwenden, wie in anderen Antworten vorgeschlagen).
Ninjakannon
94

Die vorherigen Antworten sind die richtigen, aber als schwächere Alternative können Sie sie in eine Liste umwandeln:

>>> 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
quelle
14
Dies scheint die beste einmalige Möglichkeit zu sein, Ihr gesamtes Array in einer Druckanweisung anzuzeigen.
Aaron Bramson
@ AaronBramson Ich stimme zu ... dies ist weniger fehleranfällig, wenn Sie nur eine Druckanweisung benötigen (eine Codezeile im Gegensatz zu 3 Zeilen für: Konfiguration ändern, Konfiguration drucken, Konfiguration zurücksetzen).
Trevor Boyd Smith
Ich mag, dass dies die Komma-Trennzeichen druckt
ObviousChild
57

NumPy 1.15 oder neuer

Wenn Sie NumPy 1.15 (veröffentlicht am 23.07.2018) oder neuer verwenden, können Sie den printoptionsKontextmanager verwenden:

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

(Ersetzen Sie natürlich numpydurch, npwenn Sie so importiert haben numpy)

Durch die Verwendung eines Kontextmanagers (des withBlocks) wird sichergestellt, dass die Druckoptionen nach Abschluss des Kontextmanagers auf den Stand vor dem Start des Blocks zurückgesetzt werden. Es stellt sicher, dass die Einstellung nur vorübergehend ist und nur auf Code innerhalb des Blocks angewendet wird.

Weitere Informationen zum Kontextmanager und zu den anderen unterstützten Argumenten finden Sie in der numpy.printoptionsDokumentation .

gerrit
quelle
41

Das klingt so, als würden Sie Numpy verwenden.

Wenn dies der Fall ist, können Sie hinzufügen:

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

Dadurch wird der Eckendruck deaktiviert. Weitere Informationen finden Sie in diesem NumPy-Tutorial .

Reed Copsey
quelle
4
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
Ja, dieser Teil des offiziellen Numpy-Tutorials ist falsch
aderchox
36

Hier ist eine einmalige Möglichkeit, die nützlich ist, wenn Sie Ihre Standardeinstellungen nicht ändern möchten:

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
quelle
13
Sieht so aus, als wäre dies ein guter Ort, um einen Kontextmanager zu verwenden. Sie können also "mit Volldruck" sagen.
Paul Price
8
Verwenden Sie keine 'nan', np.nanoder eine der oben genannten. Es wird nicht unterstützt, und dieser schlechte Rat verursacht Schmerzen für Menschen, die auf Python 3 umsteigen
Eric
1
@ ZSG Ersetzen Sie Zeile 5 durchnumpy.set_printoptions(threshold=numpy.inf)
Nirmal
Danke @Nirmal, ich habe diese Antwort von 2014 so bearbeitet, dass sie heute funktioniert.
Paul Rougieux
31

Verwendung eines Kontextmanagers, wie von Paul Price vorgeschlagen

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
quelle
7
Dieser Kontext - Manager in numpy 1,15, dank der integrierten github.com/numpy/numpy/pull/10406 unter dem Namennp.printoptions
Eric
13

numpy.savetxt

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

oder wenn Sie eine Zeichenfolge benötigen:

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

Das Standardausgabeformat ist:

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

und es kann mit weiteren Argumenten konfiguriert werden.

Beachten Sie insbesondere, dass dies auch die eckigen Klammern nicht anzeigt und viele Anpassungen ermöglicht, wie unter: Wie drucke ich ein Numpy-Array ohne Klammern?

Getestet auf Python 2.7.12, numpy 1.11.1.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
1
kleiner Nachteil dieser Methode ist, dass in nur mit 1d und 2d Arrays funktioniert
Fnord
@Fnord danke für diese Info, lass es mich wissen, wenn du eine Problemumgehung findest!
Ciro Santilli 8 冠状 病 六四 事件 8
10

Dies ist eine geringfügige Änderung (die Option, zusätzliche Argumente an die Antwort set_printoptions)von neok zu übergeben , wurde entfernt.

Es zeigt, wie Sie contextlib.contextmanagerauf einfache Weise einen solchen Kontextmanager mit weniger Codezeilen erstellen können:

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)

In Ihrem Code kann es folgendermaßen verwendet werden:

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
quelle
1
Sie sollten immer ein try/ finallyum das yieldin einen Kontextmanager setzen, damit die Bereinigung egal was passiert.
Eric
1
@ Eric in der Tat. Vielen Dank für Ihren hilfreichen Kommentar und ich habe die Antwort aktualisiert.
MSeifert
In 1.15 kann dies geschrieben werdenwith np.printoptions(threshold=np.inf):
Eric
6

Ergänzend zu dieser Antwort aus der maximalen Anzahl von Spalten (festgelegt mit numpy.set_printoptions(threshold=numpy.nan)) gibt es auch eine Begrenzung der anzuzeigenden Zeichen. In einigen Umgebungen, z. B. beim Aufrufen von Python aus Bash (anstelle der interaktiven Sitzung), kann dies behoben werden, indem der Parameter linewidthwie folgt festgelegt wird.

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 diesem Fall sollte Ihr Fenster die Anzahl der Zeichen zum Umbrechen der Zeile begrenzen.

Für diejenigen, die erhabenen Text verwenden und Ergebnisse im Ausgabefenster sehen möchten, sollten Sie die Erstellungsoption "word_wrap": falsezur erhabenen Erstellungsdatei [ Quelle ] hinzufügen .

Traxidus Wolf
quelle
4

Seit NumPy Version 1.16 finden Sie weitere Informationen unter GitHub Ticket 12251 .

from sys import maxsize
from numpy import set_printoptions

set_printoptions(threshold=maxsize)
Velizar VESSELINOV
quelle
4

Zum Ausschalten und Zurückkehren zum normalen Modus

np.set_printoptions(threshold=False)
ewalel
quelle
Es funktioniert bei mir (Jupyter Python Version 3). Sie können den folgenden Code ausprobieren. Gemäß der offiziellen Dokumentation sollte der folgende Code auf die Standardoptionen zurückgesetzt werden. Was es auch für mich getan hat. > np.set_printoptions (Kantenelemente = 3, infstr = 'inf', Linienbreite = 75, nanstr = 'nan', Genauigkeit = 8, unterdrücken = falsch, Schwelle = 1000, Formatierer = keine)
ewalel
Okay, es muss sein, dass ich Jupyter nicht benutze. Die akzeptierte Antwort funktioniert für mich jedoch in einer reinen Python-Umgebung.
Mathyou
Dies bedeutet threshold=0, was bedeutet "so schnell wie möglich abschneiden" - nicht das, was Sie überhaupt wollen.
Eric
2

Angenommen, Sie haben ein Numpy-Array

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

Wenn Sie das gesamte Array einmalig drucken möchten (ohne np.set_printoptions umzuschalten), aber etwas Einfacheres (weniger Code) als den Kontextmanager wünschen, tun Sie dies einfach

for row in arr:
     print row 
Mike Wojnowicz
quelle
2

Eine kleine Änderung: (da Sie eine riesige Liste drucken werden)

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

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

Dies erhöht die Anzahl der Zeichen pro Zeile (Standardzeilenbreite von 75). Verwenden Sie einen beliebigen Wert für die Linienbreite, die zu Ihrer Codierungsumgebung passt. Dies erspart Ihnen das Durchlaufen einer großen Anzahl von Ausgabezeilen, indem Sie mehr Zeichen pro Zeile hinzufügen.

Gayal Kuruppu
quelle
1

Sie können die array2stringFunktion - docs verwenden .

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

Sie möchten nicht immer, dass alle Elemente gedruckt werden, insbesondere bei großen Arrays.

Eine einfache Möglichkeit, weitere Elemente anzuzeigen:

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

Es funktioniert einwandfrei, wenn das Array standardmäßig <1000 ist.

Robin Qiu
quelle
0

Wenn Sie Pandas zur Verfügung haben,

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

vermeidet den Nebeneffekt des Zurücksetzens von numpy.set_printoptions(threshold=sys.maxsize)und Sie erhalten nicht das numpy.array und die Klammern. Ich finde das praktisch, um ein breites Array in eine Protokolldatei zu kopieren

Ben
quelle
-1

Wenn ein Array zu groß zum Drucken ist, überspringt NumPy automatisch den zentralen Teil des Arrays und druckt nur die Ecken: Um dieses Verhalten zu deaktivieren und NumPy zum Drucken des gesamten Arrays zu zwingen, können Sie die Druckoptionen mithilfe von ändern set_printoptions.

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

oder

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

Weitere Hilfe finden Sie auch in der numpy-Dokumentation numpy-Dokumentation für "oder Teil" .

Arshdeep Singh
quelle
3
Verwenden Sie keine 'nan', np.nanoder eine der oben genannten. Es wird nicht unterstützt, und dieser schlechte Rat verursacht Schmerzen für Menschen, die auf Python 3 umsteigen
Eric
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric