Bagaimana cara mencetak array NumPy lengkap, tanpa pemotongan?


589

Ketika saya mencetak array numpy, saya mendapatkan representasi terpotong, tetapi saya ingin array penuh.

Apakah ada cara untuk melakukan ini?

Contoh:

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

18
Apakah ada cara untuk melakukannya berdasarkan "satu dari"? Yaitu, untuk mencetak output penuh satu kali, tetapi tidak di waktu lain dalam skrip?
tumultous_rooster

4
@Matt O'Brien lihat jawaban ZSG di bawah ini
user2398029

6
Bisakah Anda mengubah jawaban yang diterima ke yang merekomendasikan np.inf? np.nandan 'nan'hanya bekerja dengan total kebetulan, dan 'nan'bahkan tidak bekerja di Python 3 karena mereka mengubah implementasi perbandingan tipe campuran yang threshold='nan'bergantung pada.
user2357112 mendukung Monica

1
( threshold=np.nanDaripada 'nan'tergantung pada kebetulan yang berbeda, yaitu bahwa logika pencetakan array membandingkan ukuran array dengan ambang batas a.size > _summaryThreshold. Ini selalu kembali Falseuntuk _summaryThreshold=np.nan. Jika perbandingan telah a.size <= _summaryThreshold, menguji apakah array harus sepenuhnya dicetak alih-alih menguji apakah harus diringkas, ambang ini akan memicu peringkasan untuk semua array.)
user2357112 mendukung Monica

4
Cara "satu kali" untuk melakukannya: Jika Anda memiliki numpy.array tmpsaja list(tmp). Opsi lain dengan pemformatan berbeda adalah tmp.tolist()atau untuk kontrol lebih besar print("\n".join(str(x) for x in tmp)).
travc

Jawaban:


629

Gunakan numpy.set_printoptions:

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

2
jika Anda hanya ingin mencetak numpyarray hanya sekali, sayangnya solusi ini memiliki kelemahan yang mengharuskan Anda untuk mereset perubahan konfigurasi ini setelah melakukan pencetakan.
Trevor Boyd Smith

1
@ TrevorBoydSmith, Apakah Anda tahu cara mengatur ulang parameter ini setelah dicetak?
ColinMac

1
@ColinMac lihat stackoverflow.com/a/24542498/52074 di mana ia menyimpan pengaturan. melakukan operasi. kemudian mengembalikan pengaturan.
Trevor Boyd Smith

1
Dan bagaimana cara meresetnya kembali seperti semula?
Gulzar

apakah ada cara untuk memasukkan ukuran ambang batas secara manual?
Amar Kumar

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

Saya menyarankan menggunakan np.infdaripada np.nanyang disarankan oleh orang lain. Keduanya berfungsi untuk tujuan Anda, tetapi dengan menetapkan ambang batas hingga "tak terbatas" jelas bagi semua orang yang membaca kode Anda apa yang Anda maksudkan. Memiliki ambang "bukan angka" tampaknya agak kabur bagi saya.


15
Apa operasi kebalikan dari ini? Bagaimana cara kembali ke pengaturan sebelumnya (dengan titik-titik)?
Karlo

9
@ Karlo Angka defaultnya adalah 1000, jadi np.set_printoptions(threshold=1000)akan mengembalikannya ke perilaku default. Tetapi Anda dapat mengatur ambang ini serendah atau setinggi yang Anda suka. np.set_printoptions(threshold=np.inf)cukup ubah ukuran maksimum array cetak sebelum menjadi terpotong hingga tak terbatas, sehingga tidak pernah terpotong tidak peduli seberapa besar. Jika Anda menetapkan ambang batas ke angka sebenarnya maka itu akan menjadi ukuran maksimum.
PaulMag

8
Tidak hanya ini lebih jelas, itu jauh lebih rapuh. Tidak ada yang istimewa penanganan untuk np.inf, np.nan, atau 'nan'. Apa pun yang Anda letakkan di sana, NumPy masih akan menggunakan dataran >untuk membandingkan ukuran array dengan ambang Anda. np.nanhanya bekerja karena itu a.size > _summaryThresholdbukan a.size <= _summaryThreshold, dan np.nankembali Falseuntuk semua >/ </ >=/ <=perbandingan. 'nan'hanya bekerja karena detail implementasi yang rapuh dari logika perbandingan tipe campuran Python 2; itu benar-benar rusak pada Python 3.
user2357112 mendukung Monica

2
Gunakan sys.maxsize karena nilainya didokumentasikan sebagai int
mattip

2
Untuk menjawab dengan benar pertanyaan @ Karlo, perhatikan bahwa nilai awal untuk ambang opsi cetak ditemukan di np.get_printoptions()['threshold']. Anda dapat menyimpan nilai ini sebelum menetapkan ambang batas dan kemudian mengembalikannya setelah itu (atau menggunakan withblok seperti yang disarankan dalam jawaban lain).
Ninjakannon

94

Jawaban sebelumnya adalah yang benar, tetapi sebagai alternatif yang lebih lemah Anda dapat berubah menjadi daftar:

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

14
Ini sepertinya cara terbaik satu kali untuk melihat array lengkap Anda dalam pernyataan cetak.
Aaron Bramson

@AaronBramson saya setuju ... ini kurang rawan kesalahan ketika Anda hanya membutuhkan satu pernyataan cetak (satu baris kode yang bertentangan dengan 3 baris untuk: ubah konfigurasi, cetak, atur ulang konfigurasi).
Trevor Boyd Smith

Saya suka ini mencetak pemisah koma
ObviousChild

58

NumPy 1.15 atau lebih baru

Jika Anda menggunakan NumPy 1.15 (dirilis 2018-07-23) atau lebih baru, Anda dapat menggunakan printoptionsmanajer konteks:

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

(tentu saja, ganti numpydengan npjika itu cara Anda mengimpor numpy)

Penggunaan manajer konteks ( with-block) memastikan bahwa setelah manajer konteks selesai, opsi cetak akan kembali ke apa pun mereka sebelum blok dimulai. Ini memastikan pengaturan bersifat sementara, dan hanya diterapkan pada kode di dalam blok.

Lihat numpy.printoptionsdokumentasi untuk perincian tentang manajer konteks dan argumen apa yang didukungnya.


41

Ini terdengar seperti Anda menggunakan numpy.

Jika demikian, Anda dapat menambahkan:

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

Itu akan menonaktifkan pencetakan sudut. Untuk informasi lebih lanjut, lihat Tutorial NumPy ini .


4
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric

Ya, itu bagian dari tutorial Numpy resmi salah
aderchox

37

Ini adalah satu-satunya cara untuk melakukan ini, yang berguna jika Anda tidak ingin mengubah pengaturan default Anda:

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)

13
Sepertinya ini akan menjadi tempat yang baik untuk menggunakan manajer konteks, sehingga Anda dapat mengatakan "dengan cetakan penuh".
Paul Price

8
Jangan gunakan 'nan', np.nanatau apapun di atas. Ini tidak didukung, dan saran buruk ini menyebabkan rasa sakit bagi orang yang beralih ke python 3
Eric

1
@ZSG Ganti baris 5 dengannumpy.set_printoptions(threshold=numpy.inf)
Nirmal

Terima kasih @Nirmal, saya mengedit jawaban 2014 ini sehingga berfungsi hari ini.
Paul Rougieux

31

Menggunakan manajer konteks sebagai Paul Price 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)


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

    with fullprint():
        print(a)

    print(a)

    with fullprint(threshold=None, edgeitems=10):
        print(a)

7
Manajer konteks ini dibangun dalam 1.15 numpy, terima kasih kepada github.com/numpy/numpy/pull/10406 , dengan namanp.printoptions
Eric

13

numpy.savetxt

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

atau jika Anda membutuhkan string:

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

Format output default adalah:

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

dan itu dapat dikonfigurasi dengan argumen lebih lanjut.

Perhatikan khususnya bagaimana ini juga tidak menunjukkan tanda kurung siku, dan memungkinkan banyak penyesuaian, seperti yang disebutkan di: Bagaimana cara mencetak array Numpy tanpa tanda kurung?

Diuji pada Python 2.7.12, numpy 1.11.1.


1
Kelemahan kecil untuk metode ini adalah bahwa hanya bekerja dengan array 1d dan 2d
Fnord

@Fnord terima kasih atas info ini, beri tahu saya jika Anda menemukan solusinya!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

10

Ini adalah sedikit modifikasi (dihapus pilihan untuk melewati argumen tambahan untuk set_printoptions)dari neok s jawaban.

Ini menunjukkan bagaimana Anda dapat menggunakan contextlib.contextmanageruntuk membuat manajer konteks seperti itu dengan lebih sedikit baris kode:

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)

Dalam kode Anda dapat digunakan seperti ini:

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)

1
Anda harus selalu meletakkan try/ finallydi yielddalam konteks manajer, sehingga pembersihan terjadi apa pun yang terjadi.
Eric

1
@Eric memang. Terima kasih atas komentar Anda yang bermanfaat dan saya telah memperbarui jawabannya.
MSeifert

Di 1.15, ini bisa diejawith np.printoptions(threshold=np.inf):
Eric

6

Sebagai pelengkap jawaban ini dari jumlah kolom maksimum (dengan tetap numpy.set_printoptions(threshold=numpy.nan)), ada juga batas karakter yang akan ditampilkan. Di beberapa lingkungan seperti saat memanggil python dari bash (daripada sesi interaktif), ini bisa diperbaiki dengan mengatur parameter linewidthsebagai berikut.

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)

Dalam hal ini, jendela Anda harus membatasi jumlah karakter untuk membungkus garis.

Bagi mereka yang menggunakan teks luhur dan ingin melihat hasil dalam jendela output, Anda harus menambahkan opsi build "word_wrap": falseke file [ source ] sublime-build .



4

Untuk mematikannya dan kembali ke mode normal

np.set_printoptions(threshold=False)

Ini berfungsi untuk saya (Jupyter python versi 3). Anda dapat mencoba kode di bawah ini. Sesuai dengan dokumentasi resmi, kode di bawah ini harus dikembalikan ke opsi default. Yang itu lakukan untuk saya juga. > np.set_printoptions (edgeitems = 3, infstr = 'inf', linewidth = 75, nanstr = 'nan', presisi = 8, tekan = Salah, ambang batas = 1000, formatter = Tidak Ada)
ewalel

Oke, itu pasti karena saya tidak menggunakan Jupyter. Jawaban yang diterima tidak bekerja untuk saya di lingkungan python murni.
Mathyou

Ini berarti threshold=0, yang berarti "potong sesegera mungkin" - bukan yang Anda inginkan sama sekali.
Eric

2

Misalkan Anda memiliki array numpy

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

Jika Anda ingin mencetak array lengkap dengan cara satu kali (tanpa mengubah opsi np.set_print), tetapi menginginkan sesuatu yang lebih sederhana (lebih sedikit kode) daripada manajer konteks, lakukan saja

for row in arr:
     print row 

2

Sedikit modifikasi: (karena Anda akan mencetak daftar besar)

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

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

Ini akan menambah jumlah karakter per baris (garis-lebar default 75). Gunakan nilai apa pun yang Anda suka untuk linewidth yang sesuai dengan lingkungan pengkodean Anda. Ini akan menyelamatkan Anda dari keharusan untuk melalui sejumlah besar garis keluaran dengan menambahkan lebih banyak karakter per baris.


1

Anda dapat menggunakan array2stringfungsi - docs .

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

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric

1

Anda tidak akan selalu ingin semua item dicetak, terutama untuk array besar.

Cara sederhana untuk menampilkan lebih banyak item:

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

Ini berfungsi dengan baik ketika irisan array <1000 secara default.


0

Jika Anda memiliki panda yang tersedia,

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

menghindari efek samping yang memerlukan reset numpy.set_printoptions(threshold=sys.maxsize)dan Anda tidak mendapatkan numpy.array dan kurung. Saya menemukan ini nyaman untuk membuang berbagai ke dalam file log


-1

Jika array terlalu besar untuk dicetak, NumPy secara otomatis melompati bagian tengah array dan hanya mencetak sudut-sudut: Untuk menonaktifkan perilaku ini dan memaksa NumPy untuk mencetak seluruh array, Anda dapat mengubah opsi pencetakan menggunakan set_printoptions.

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

atau

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

Anda juga dapat merujuk ke dokumentasi numpy dokumentasi numpy untuk "atau bagian" untuk bantuan lebih lanjut.


3
Jangan gunakan 'nan', np.nanatau apapun di atas. Ini tidak didukung, dan saran yang buruk ini menyebabkan rasa sakit bagi orang-orang yang beralih ke python 3
Eric

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.