如何在不截断的情况下打印完整的NumPy数组?


587

当我打印一个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]])

18
有没有一种方法可以“一次性”完成?也就是说,只打印一次完整的输出,而不是其他时间打印?
tumultous_rooster 2014年

4
@Matt O'Brien在下方查看ZSG的答案
user2398029 2014年

6
您可以将接受的答案更改为推荐的答案np.inf吗?np.nan并且'nan'只能由总侥幸工作,并'nan'没有在Python 3连的工作,因为他们改变了混合型比较实现threshold='nan'有赖于。
user2357112支持Monica

1
threshold=np.nan而不是'nan'依赖于不同的锚爪,这是阵列打印逻辑数组大小进行比较,以与阈值a.size > _summaryThreshold,这总是返回False_summaryThreshold=np.nan。如果比较过a.size <= _summaryThreshold,检测是否所述阵列应完全印刷,而不是测试它是否应该总结一下,此阈值将触发所有阵列的汇总。)
user2357112支持Monica

4
A“一次性”这样做的方式:如果你有一个numpy.array tmp公正list(tmp)。其他具有不同格式的选项是tmp.tolist()或用于更多控制print("\n".join(str(x) for x in tmp))
travc '17

Answers:


626

用途numpy.set_printoptions

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

2
如果您只想打印一次numpy阵列,那么不幸的是,该解决方案的缺点是要求您在打印后重置​​此配置更改。
Trevor Boyd Smith,

1
@TrevorBoydSmith,您知道打印后如何重设此参数吗?
ColinMac

1
@ColinMac请参阅stackoverflow.com/a/24542498/52074,在其中保存设置。进行操作。然后恢复设置。
Trevor Boyd Smith,

1
以及如何将其重置为正常状态?
Gulzar

有什么方法可以手动输入阈值大小?
Amar Kumar

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

我建议使用,np.inf而不是np.nan别人建议的。它们都为您的目的而工作,但是通过将阈值设置为“无穷大”,对于每个阅读您的代码的人来说都是显而易见的。对我来说,达到“没有数字”的门槛似乎有点模糊。


15
这是什么逆运算?如何返回上一个设置(带点)?
卡洛

9
@Karlo默认数字为1000,因此np.set_printoptions(threshold=1000)会将其还原为默认行为。但是您可以根据需要将阈值设置为低或高。np.set_printoptions(threshold=np.inf)只需更改打印数组被截断为无限之前可以达到的最大大小,以使它无论大小都不会被截断。如果将阈值设置为任何实数,则将为最大大小。
PaulMag

8
这不仅更清晰,而且不那么脆弱。有没有特殊的处理np.infnp.nan'nan'。无论您放置在哪里,NumPy仍将使用纯文本将>数组的大小与阈值进行比较。np.nan不仅是因为它是发生在工作a.size > _summaryThreshold,而不是a.size <= _summaryThresholdnp.nan回报False所有>/ </ >=/ <=比较。'nan'仅由于Python 2的混合类型比较逻辑的脆弱的实现细节而起作用;它的Python 3.彻底击破
user2357112支持莫妮卡

2
使用sys.maxsize,因为该值已记录为int
mattip

2
要正确回答@Karlo的问题,请注意,在中找到了打印选项阈值的初始值np.get_printoptions()['threshold']。您可以在设置阈值之前存储此值,然后再恢复它(或使用with其他答案中建议的阻止方式)。
Ninjakannon

94

先前的答案是正确的,但是作为较弱的选择,您可以转换为列表:

>>> 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
这似乎是在打印语句中查看完整阵列的最佳一次性方法。
亚伦·布拉姆森

@AaronBramson我同意...当您只需要一条打印语句(一行代码而不是三行代码:更改配置,打印,重置配置)时,这种错误较少发生。
Trevor Boyd Smith,

我喜欢这样打印逗号分隔符
ObviousChild

57

NumPy 1.15或更高版本

如果您使用NumPy 1.15(2018年7月23日发行)或更高版本,则可以使用printoptions上下文管理器:

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

(当然,如果您导入的方式是,请替换numpy为)npnumpy

使用上下文管理器(with-block)可确保在上下文管理器完成后,打印选项将恢复为块启动之前的状态。它确保设置是临时的,并且仅应用于块内的代码。

有关上下文管理器及其支持的其他参数的详细信息,请参见numpy.printoptions文档


41

听起来您正在使用numpy。

如果是这样,您可以添加:

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

这将禁用边角打印。有关更多信息,请参见此NumPy教程


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

是的,Numpy官方教程的那部分是错误的
aderchox

36

这是一种一次性的方法,如果您不想更改默认设置,这将非常有用:

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
看起来这是使用上下文管理器的好地方,因此您可以说“ with fullprint”。
保罗·普赖斯

8
请勿使用'nan'np.nan或以上任何一种。它不受支持,这个错误的建议正给人们过渡到python 3带来痛苦
Eric

1
@ZSG将第5行替换为numpy.set_printoptions(threshold=numpy.inf)
Nirmal,

感谢@Nirmal,我编辑了2014年的答案,因此今天可以使用。
Paul Rougieux

31

使用上下文管理作为保价 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
感谢github.com/numpy/numpy/pull/10406,该上下文管理器内置于numpy 1.15中,名称为np.printoptions
Eric

13

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

并可以使用其他参数进行配置。

特别要注意的是,它也不会显示方括号,并允许进行大量自定义,如以下内容所述:如何打印不带括号的Numpy数组?

在python 2.7.12,numpy 1.11.1上测试。


1
此方法的一个小缺点是只能在1d和2d阵列上使用
Fnord

@Fnord感谢您提供此信息,如果您找到解决方法,请告诉我!
西罗Santilli郝海东冠状病六四事件法轮功

10

这是一个微小的修饰(除去传递额外的参数选项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)
    try:
        yield
    finally:
        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)

1
你应该总是把try/ finally环绕yield在上下文管理器,从而使清理发生的无论什么。
埃里克(Eric)

1
确实是@Eric。感谢您的宝贵意见,我已经更新了答案。
MSeifert

在1.15中,这可以拼写with np.printoptions(threshold=np.inf):
Eric

6

除了最大列数(以固定)之外,此答案numpy.set_printoptions(threshold=numpy.nan)还可以显示一定数量的字符。在某些环境中,例如从bash调用python(而不是交互式会话)时,可以通过如下设置参数来解决此问题linewidth

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)

在这种情况下,您的窗口应限制换行符的字符数。

对于那些使用sublime文本并希望在输出窗口中查看结果的用户,应将build选项添加"word_wrap": false到sublime-build文件[ source ]中。



4

要关闭它并返回正常模式

np.set_printoptions(threshold=False)

它对我有用(Jupyter python版本3)。您可以尝试以下代码。根据官方文档,以下代码应恢复为默认选项。它也为我做了。> np.set_printoptions(edgeitems = 3,infstr ='inf',线宽= 75,nanstr ='nan',精度= 8,抑制=假,阈值= 1000,格式=无)
ewalel

好的,一定是因为我没有使用Jupyter。接受的答案确实在纯python环境中对我有用。
Mathyou

这意味着threshold=0,这意味着“尽快截断”-根本不是您想要的。
埃里克

2

假设您有一个numpy数组

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

如果要一次性打印整个数组(不切换np.set_printoptions),但是想要比上下文管理器更简单(更少的代码)的方法,那就做

for row in arr:
     print row 

2

稍作修改:(因为您要打印大量列表)

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

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

这将增加每行的字符数(默认线宽为75)。使用任何您喜欢的值作为适合您的编码环境的线宽。通过每行添加更多字符,这将使您不必遍历大量输出行。


1

您可以使用array2string功能-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
埃里克

1

您不会总是希望打印所有项目,尤其是对于大型阵列。

一种显示更多项目的简单方法:

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

默认情况下,当切片的数组<1000时,它可以正常工作。


0

如果有熊猫

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

避免了需要重新设置的副作用,numpy.set_printoptions(threshold=sys.maxsize)并且您没有得到numpy.array和方括号。我发现这很方便将大量数组转储到日志文件中


-1

如果一个数组太大而无法打印,NumPy会自动跳过该数组的中央部分而仅打印角点:要禁用此行为并强制NumPy打印整个数组,可以使用更改打印选项set_printoptions

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

要么

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

您也可以参考numpy文档 numpy文档中的“或部分”以获取更多帮助。


3
请勿使用'nan'np.nan或以上任何一种。它不受支持,这个错误的建议正给人们过渡到python 3带来痛苦
Eric

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
埃里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.