2010-01-01 108 views
284

當我打印一個numpy數組時,我得到一個截斷的表示,但我想要完整的數組。如何打印完整的NumPy數組?

有沒有辦法做到這一點?

例子:

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

有沒有辦法做到這一點是「一次性」的基礎上的Th? at是,打印出完整的輸出一次,但不是在其他時間在腳本中? –

+2

@Matt O'Brien請參閱下面的ZSG的回答 – user2398029

+3

您能否將接受的答案更改爲推薦'np.inf'的那個? 'np.nan'和''nan''只能通過總僥倖運行,[''nan''甚至不能在Python 3中工作](http://ideone.com/tjyGhX),因爲他們改變了混合模式,類型比較實現'threshold ='nan''依賴。 – user2357112

回答

302

要在裏德的回答澄清

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

注意,上面給出的答覆與工作距離numpy的進口*',這是不可取的初始。 這也爲我的作品

numpy.set_printoptions(threshold='nan') 

的完整文檔,請參閱http://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html

+15

對於新手來說,錯誤信息如TypeError:無法定義的類型:int()> str()'不是一個非常明確的診斷;如果你使用'numpy作爲np',但是忘記用'np'作爲你的閾值定義的前綴,那麼就會發生。因此,爲了澄清,如果你將numpy作爲X導入,你需要指定閾值爲'X.nan'或'X .inf'。例如,'import numpy as np'需要'np.set_printoptions(threshold = np.nan)'。 –

+7

對我而言,設置'threshold ='nan''不起作用。設置「threshold = np.inf」按照@PaulMag建議的方式工作 – Shamps

+1

@Shamps在這裏相同。設置threshold ='nan''後,沒有任何內容被打印出來。用'np.inf'打印所有內容。 – Karlo

35

這聽起來像你正在使用numpy的。

如果是這樣的話,你可以添加:

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

時將禁止角落打印。有關更多信息,請參見NumPy Tutorial

+4

請注意,我相信你需要'threshold ='nan''(也就是'nan'的引號),或者你必須導入常量:'from numpy import nan' – charleslparker

27

這裏是一個一次性的方式做到這一點,如果你不希望更改默認設置,這是有用的:

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

看起來這將是一個使用上下文管理器的好地方,所以你可以說「用fullprint」。 –

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

我建議使用的np.inf代替np.nan其建議由他人。它們都是爲你的目的而工作的,但是通過將閾值設置爲「無窮大」,每個人都明白你的代碼是什麼意思。有一個「不是數字」的門檻似乎對我有點模糊。

+2

這是什麼反作用?如何回到之前的設置(帶點)? – Karlo

+4

@Karlo默認數字是1000,因此'np.set_printoptions(threshold = 1000)'會將它恢復爲默認行爲。但是,您可以根據需要將此閾值設置爲低或高。 'np.set_printoptions(threshold = np.inf)'只是簡單地改變了打印數組在截斷到無限之前的最大大小,所以無論多大,它都不會被截斷。如果將閾值設置爲任何實數,那麼這將是最大值。 – PaulMag

+4

這不僅更清晰,而且更脆弱。對於'np.inf','np.nan'或''nan'',**沒有特殊的處理**。無論你放在那裏,NumPy仍然會使用普通的'>'來比較數組的大小和閾值。 ''np.nan'只會發生作用,因爲它的'a.size> _summaryThreshold'而不是'a.size <= _summaryThreshold',並且'np.nan'爲所有''''返回'False'' '<='比較。由於Python 2的混合類型比較邏輯的脆弱實現細節,「nan」只能正常工作;它在Python 3上完全中斷。 – user2357112

29

以前的答案是正確的,但作爲一個weeker替代,你可以變身成一個列表:

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

使用上下文管理作爲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

這是對上下文管理器的巧妙使用。 – timgeb

8

numpy.savetxt

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

或者如果你需要一個字符串:

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

默認輸出格式爲:

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

,它可以與其它參數進行配置。

測試Python 2.7.12,numpy 1.11.1。

5

對於這些誰喜歡進口爲NP:

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

還將努力

0

如果數組是太大而無法打印,NumPy的自動跳過該陣列的中央部分,只打印角落: 要禁用此行爲,並迫使NumPy的打印整個陣列,您可以使用更改打印選項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) 

你也可以reffer numpy documentationnumpy documentation for "or part"更多的幫助

-3

它就像python的範圍,使用np.range(10001) 歡迎! 。

4

這是一個輕微的修改(除去通過額外的參數set_printoptions)neok的答案的選項

它顯示瞭如何使用contextlib.contextmanager輕鬆地創建具有更少的代碼這樣的contextmanager:

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) 

在你的代碼可以使用這樣的:

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

這是太棒了,很好,很短,工作得很好。 – Korzak