如何打印完整的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]])
978365 次浏览

这听起来像你在使用numpy。

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

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

这将禁用角打印。有关详细信息,请参阅此NumPy教程

使用numpy.set_printoptions

import sysimport numpynumpy.set_printoptions(threshold=sys.maxsize)

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

def fullprint(*args, **kwargs):from pprint import pprintimport numpyopt = numpy.get_printoptions()numpy.set_printoptions(threshold=numpy.inf)pprint(*args, **kwargs)numpy.set_printoptions(**opt)
import numpy as npnp.set_printoptions(threshold=np.inf)

我建议使用np.inf而不是其他人建议的np.nan。它们都符合你的目的,但是通过将阈值设置为“无穷大”,每个阅读你的代码的人都很明显你的意思。设置“不是数字”的阈值对我来说似乎有点模糊。

前面的答案是正确的,但作为较弱的替代方案,您可以转换为列表:

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

使用保罗·普莱斯建议的上下文管理器

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)

numpy.savetxt

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

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

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

默认输出格式为:

0.000000000000000000e+001.000000000000000000e+002.000000000000000000e+003.000000000000000000e+00...

它可以用进一步的参数配置。

请特别注意,这也没有显示方括号,并且允许大量自定义,如以下所述:如何打印没有括号的Numpy数组?

在Python 2.7.12上测试,numpy 1.11.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留档为"or part"以获得更多帮助。

这是一个轻微的修改(删除了将额外参数传递给set_printoptions) ofneok的答案的选项。

它展示了如何使用contextlib.contextmanager用更少的代码行轻松创建这样的上下文管理器:

import numpy as npfrom contextlib import contextmanager
@contextmanagerdef show_complete_array():oldoptions = np.get_printoptions()np.set_printoptions(threshold=np.inf)try:yieldfinally: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)

假设你有一个numpy数组

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

如果您想一次性打印完整的数组(不切换np.set_printoptions),但想要比上下文管理器更简单(代码更少),只需

for row in arr:print row

您可以使用array2string函数-文档

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

作为对最大列数的回答的补充(用numpy.set_printoptions(threshold=numpy.nan)修复),还限制了要显示的字符。在某些环境中,例如从bash(而不是交互式会话)调用python时,可以通过将参数linewidth设置为以下内容来修复此问题。

import numpy as npnp.set_printoptions(linewidth=2000)    # default = 75Mat = np.arange(20000,20150).reshape(2,75)    # 150 elements (75 columns)print(Mat)

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

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

临时设置

如果您使用NumPy 1.15(2018-07-23发布)或更新版本,您可以使用printoptions上下文管理器:

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

(当然,如果这是您导入numpy的方式,请将numpy替换为np

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

有关上下文管理器及其支持的其他参数的详细信息,请参阅#0留档

从NumPy版本1.16开始,有关更多详细信息,请参阅github工单12251

from sys import maxsizefrom numpy import set_printoptions
set_printoptions(threshold=maxsize)

您不会总是希望打印所有项目,特别是对于大型数组。

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

In [349]: arOut[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时,它可以正常工作。

把它关掉,回到正常模式

np.set_printoptions(threshold=False)

稍作修改:(因为你要打印一个巨大的列表)

import numpy as npnp.set_printoptions(threshold=np.inf, linewidth=200)
x = np.arange(1000)print(x)

这将增加每行的字符数(默认线宽为75)。为适合您的编码环境的线宽使用任何您喜欢的值。这将通过每行添加更多字符来节省您处理大量输出行的时间。

如果你有熊猫,

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

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

如果您使用的是Jupyter,请尝试变量检验员扩展。您可以单击每个变量以查看整个数组。

如果你使用的是jupyter笔记本,我发现这是一次性情况下最简单的解决方案。基本上将numpy数组转换为列表,然后转换为字符串,然后打印。这的好处是将逗号分隔符保留在数组中,而使用numpyp.printoptions(threshold=np.inf)不会:

import numpy as npprint(str(np.arange(10000).reshape(250,40).tolist()))
with np.printoptions(edgeitems=50):print(x)

把50改成你想看多少行

来源:这里

这是最hackiest的解决方案,它甚至可以像numpy一样很好地打印它:

import numpy as np
a = np.arange(10000).reshape(250,40)
b = [str(row) for row in a.tolist()]
print('\n'.join(b))

外出:

终端输出