Tam NumPy dizisini kesmeden nasıl yazdırabilirim?


589

Bir numpy dizi yazdırdığımda, kesilmiş bir temsil olsun, ama tam dizi istiyorum.

Bunu yapmanın bir yolu var mı?

Örnekler:

>>> 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
Bunu "tek seferlik" olarak yapmanın bir yolu var mı? Yani, tam çıktıyı bir kez yazdırmak, ancak komut dosyasında başka zamanlarda yazdırmamak mı?
tumultous_rooster

4
@Matt O'Brien aşağıdaki ZSG'nin cevabına bakınız
user2398029

6
Kabul edilen cevabı tavsiye eden kişiye değiştirebilir misiniz np.inf? np.nanve 'nan'sadece toplam fluke ile 'nan'çalışır ve Python 3'te bile çalışmaz, çünkü threshold='nan'bağlı olan karışık tip karşılaştırma uygulamasını değiştirdiler .
user2357112, Monica

1
( threshold=np.nanYerine 'nan'dizi baskı mantığı ile eşiğine dizi boyutu karşılaştırır Farklı fluke bağlıdır a.size > _summaryThreshold. Bu, her zaman döner Falseiçin _summaryThreshold=np.nan. Karşılaştırması olsaydı a.size <= _summaryThreshold, dizi tam olarak yerine test basılıp basılmaması gerektiğini belirlemek test gerektiği ister özetlenecek olursa, bu eşik tüm diziler için özetlemeyi tetikler.)
user2357112 20 Haziran'da Monica

4
Bunu yapmanın "tek seferlik" bir yolu: tmpSadece bir numpy.array öğeniz varsa list(tmp). Farklı biçimlendirmeye sahip diğer seçenekler tmp.tolist()veya daha fazla kontrol içindir print("\n".join(str(x) for x in tmp)).
travc

Yanıtlar:


629

Kullanım numpy.set_printoptions:

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

2
bir numpydiziyi yalnızca bir kez yazdırmak istiyorsanız , ne yazık ki bu çözüm, yazdırma işleminden sonra bu yapılandırma değişikliğini sıfırlamanızı gerektirecektir.
Trevor Boyd Smith

1
@TrevorBoydSmith, Baskıdan sonra bu parametreyi nasıl sıfırlayacağınızı biliyor musunuz?
ColinMac

1
@ColinMac ayarları kaydettiği stackoverflow.com/a/24542498/52074 adresine bakın . bir işlem yapar. ardından ayarları geri yükler.
Trevor Boyd Smith

1
Ve normale nasıl sıfırlanır?
Gülzar

eşik boyutunu manuel olarak girmenin bir yolu var mı?
Amar Kumar

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

Başkaları tarafından önerilen np.infyerine kullanmayı öneririm np.nan. Her ikisi de sizin amacınız için çalışır, ancak eşiği "sonsuzluğa" ayarlayarak ne demek istediğinizi kodunuzu okuyan herkes için açıktır. "Sayı değil" eşiğine sahip olmak bana biraz belirsiz geliyor.


15
Bunun ters işlemi nedir? Önceki ayara nasıl geri dönülür (noktalarla)?
Karlo

9
@Karlo Varsayılan sayı 1000'dir, bu nedenle np.set_printoptions(threshold=1000)varsayılan davranışa geri döner . Ancak bu eşiği istediğiniz kadar düşük veya yüksek olarak ayarlayabilirsiniz. np.set_printoptions(threshold=np.inf)yazdırılan bir dizinin sonsuz kesilmeden önce olabileceği maksimum boyutu değiştirir, böylece ne kadar büyük olursa olsun asla kesilmez. Eşiği herhangi bir gerçek sayıya ayarlarsanız, bu maksimum boyut olacaktır.
PaulMag

8
Sadece bu daha net değil, daha az kırılgan. Orada taşıma hiçbir özel için np.inf, np.nanya da 'nan'. Oraya ne koyarsanız koyun, NumPy >, dizinin boyutunu eşikinizle karşılaştırmak için yine de bir düz kullanır. np.nansadece a.size > _summaryThresholdbunun yerine çalışır a.size <= _summaryThresholdve tüm / / / karşılaştırmaları için np.nangeri döner . sadece Python 2'nin karışık tip karşılaştırma mantığının kırılgan uygulama detayları nedeniyle işe yarar; Python 3'te tamamen kırılıyor.False><>=<='nan'
user2357112 Monica

2
Değeri beri kullan sys.maxsize bir int olmak belgelenmiştir
mattip

2
@ Karlo'nun sorusunu doğru bir şekilde cevaplamak için, yazdırma seçenekleri eşiği için başlangıç ​​değerinin içinde bulunduğunu unutmayın np.get_printoptions()['threshold']. Eşiği ayarlamadan önce bu değeri saklayabilir ve daha sonra geri yükleyebilirsiniz (veya withdiğer yanıtlarda önerildiği gibi bir blok kullanabilirsiniz ).
Ninjakannon

94

Önceki cevaplar doğru cevaplar, ancak daha zayıf bir alternatif olarak bir listeye dönüştürebilirsiniz:

>>> 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
Bu, tüm dizinizi bir print deyiminde görmenin en iyi tek seferlik yolu gibi görünüyor.
Aaron Bramson

@AaronBramson katılıyorum ... Bu sadece bir baskı deyimi gerektiğinde daha az hata eğilimi (3 satır yerine bir kod satırı: değiştirmek yapılandırma, baskı, yapılandırma sıfırlama).
Trevor Boyd Smith

Ben bu virgül ayırıcılar yazdırır gibi
ObviousChild

57

NumPy 1.15 veya daha yenisi

NumPy 1.15 (2018-07-23 yayınlandı) veya daha yenisini kullanıyorsanız, printoptionsiçerik yöneticisini kullanabilirsiniz :

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

(tabii ki, yerine numpygöre npithal nasıl buysa numpy)

Bir bağlam yöneticisi ( with-block) kullanımı, bağlam yöneticisi bittikten sonra, yazdırma seçeneklerinin blok başlamadan önceki haline geri dönmesini sağlar. Ayarın geçici olmasını ve yalnızca blok içindeki koda uygulanmasını sağlar.

İçerik yöneticisi ve desteklediği diğer bağımsız değişkenlerle ilgili ayrıntılar için numpy.printoptionsbelgelere bakın .


41

Kulağa numpy kullandığınız anlaşılıyor.

Bu durumda, şunları ekleyebilirsiniz:

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

Bu köşe yazdırmayı devre dışı bırakır. Daha fazla bilgi için bu NumPy Eğiticisine bakın .


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

Evet, Resmi Numpy eğitiminin bu bölümü yanlış
aderchox

36

Aşağıda, varsayılan ayarlarınızı değiştirmek istemiyorsanız yararlı olacak tek seferlik bir yol verilmiştir:

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
Görünüşe göre bu bir bağlam yöneticisi kullanmak için iyi bir yer, bu yüzden "tam baskı ile" diyebilirsiniz.
Paul Price

8
Kullanmayın 'nan', np.nanya da yukarıdakilerin herhangi. Desteklenmiyor ve bu kötü tavsiye, python 3'e geçiş yapan insanlar için acıya neden oluyor
Eric

1
@ZSG 5. satırı yerinenumpy.set_printoptions(threshold=numpy.inf)
Nirmal

Teşekkürler @Nirmal, bu 2014 cevabını düzenledim, böylece bugün çalışıyor.
Paul Rougieux

31

Paul Price'ın önerdiği gibi bir içerik yöneticisi kullanma

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
Bu bağlam yöneticisi, numpy 1.15 içine sayesinde inşa edilmiştir github.com/numpy/numpy/pull/10406 adı altında,np.printoptions
Eric

13

numpy.savetxt

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

veya bir dizeye ihtiyacınız varsa:

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

Varsayılan çıktı biçimi:

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

ve daha fazla argümanla yapılandırılabilir.

Özellikle bunun köşeli parantezleri nasıl göstermediğine ve aşağıda belirtildiği gibi birçok özelleştirmeye izin verdiğine dikkat edin: Numpy dizisi parantez olmadan nasıl yazdırılır?

Python 2.7.12, numpy 1.11.1 üzerinde test edilmiştir.


1
Bu yöntemin küçük dezavantajı, sadece 1d ve 2d dizilerle çalışır
Fnord

@ Bu bilgi için teşekkürler, bir çözüm bulursanız bana bildirin!
Ciro Santilli 法轮功 15 病 六四 事件 法轮功

10

Bu hafif bir modifikasyon (kaldırıldı ek argümanlar geçmek seçenektir set_printoptions)ait neok s cevabı.

Daha contextlib.contextmanageraz kod satırı ile böyle bir bağlam yöneticisini kolayca oluşturmak için nasıl kullanabileceğinizi gösterir :

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)

Kodunuzda şu şekilde kullanılabilir:

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
İçerik yöneticisine her zaman try/ finallyçevresini koymalısınız yield, böylece temizleme ne olursa olsun gerçekleşir.
Eric

1
@ Gerçekten de. Yararlı yorumunuz için teşekkür ederiz, yanıtı güncelledim.
MSeifert

1.15'te bu hecelenebilirwith np.printoptions(threshold=np.inf):
Eric

6

Bu yanıtı (ile sabitlenmiş numpy.set_printoptions(threshold=numpy.nan)) maksimum sütun sayısının tamamlayıcısı olarak , görüntülenecek bir karakter sınırı da vardır. Python'u bash'den (interaktif oturum yerine) çağırırken olduğu gibi bazı ortamlarda, bu parametre linewidthaşağıdaki gibi ayarlanarak düzeltilebilir .

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)

Bu durumda, pencereniz satırı sarmak için karakter sayısını sınırlamalıdır.

Yüce metin kullanan ve çıktı penceresinde sonuçları görmek isteyenler "word_wrap": falseiçin, sublime-build dosyasına [ kaynak ] derleme seçeneğini eklemelisiniz .



4

Kapatmak ve normal moda geri dönmek için

np.set_printoptions(threshold=False)

Benim için çalışıyor (Jupyter python sürüm 3). Aşağıdaki kodu deneyebilirsiniz.Resmi dokümantasyona göre aşağıdaki kod varsayılan seçeneklere geri konmalıdır. Hangi benim için yaptı. > np.set_printoptions (kenar öğeleri = 3, infstr = 'inf', çizgi genişliği = 75, nanstr = 'nan', hassasiyet = 8, gizleme = Yanlış, eşik = 1000, biçimlendirici = Yok)
ewalel

Tamam, çünkü Jupyter kullanmıyorum. Kabul edilen cevap benim için saf bir python ortamında işe yarıyor.
Mathyou

Bunun anlamı threshold=0, "mümkün olan en kısa sürede kes" anlamına gelir.
Eric

2

Diyelim ki bir numpy diziniz var

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

Tüm diziyi tek seferlik bir şekilde yazdırmak istiyorsanız (np.set_printoptions öğesini değiştirmeden), ancak içerik yöneticisinden daha basit bir şey (daha az kod) istiyorsanız,

for row in arr:
     print row 

2

Küçük bir değişiklik: (büyük bir liste basacağınız için)

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

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

Bu, satır başına karakter sayısını artıracaktır (varsayılan satır genişliği 75). Kodlama ortamınıza uyan çizgi genişliği için istediğiniz değeri kullanın. Bu, her satıra daha fazla karakter ekleyerek sizi çok sayıda çıkış satırından geçmek zorunda bırakmaz.


1

array2string- docs işlevini kullanabilirsiniz .

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

Özellikle büyük diziler için tüm öğelerin her zaman yazdırılmasını istemezsiniz.

Daha fazla öğe göstermenin basit bir yolu:

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

Varsayılan olarak dizi <1000 dilimlenirse iyi çalışır.


0

Pandalarınız varsa,

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

sıfırlamanın gerekli yan etkilerini önler ve numpy.set_printoptions(threshold=sys.maxsize)numpy.array ve braketleri alamazsınız. Bunu geniş bir diziyi bir günlük dosyasına dökmek için uygun buluyorum


-1

Bir dizi yazdırılamayacak kadar büyükse, NumPy otomatik olarak dizinin orta kısmını atlar ve yalnızca köşeleri yazdırır: Bu davranışı devre dışı bırakmak ve NumPy'yi tüm diziyi yazdırmaya zorlamak için aşağıdakileri kullanarak yazdırma seçeneklerini değiştirebilirsiniz: set_printoptions .

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

veya

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

Daha fazla yardım için "veya bölüm" için numpy dokümantasyon numpy dokümanına da bakabilirsiniz .


3
Kullanmayın 'nan', np.nanya da yukarıdakilerin herhangi. Desteklenmiyor ve bu kötü tavsiye, python 3'e geçiş yapan insanlar için acıya neden oluyor
Eric

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.