关于python:如何在不截断的情况下打印完整的numpy数组?

How to print the full NumPy array, without truncation?

当我打印一个numpy数组时,会得到一个截断的表示,但我需要完整的数组。

有什么办法吗?

实例:

1
2
3
4
5
6
7
8
9
10
11
>>> 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]])


使用numpy.set_printoptions

1
2
3
import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)


1
2
import numpy as np
np.set_printoptions(threshold=np.inf)

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


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

1
2
3
4
5
6
7
>>> 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]]


这听起来像是你在用麻药。

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

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

这将禁用角打印。有关详细信息,请参见本numpy教程。


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

1
2
3
4
5
6
7
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)


使用上下文管理器作为Paul Price建议

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

a = np.arange(1001)

with fullprint():
    print(a)

print(a)

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


numpy 1.15或更新版本

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

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

(当然,如果你进口了numpy,就用np代替numpy

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

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


numpy.savetxt

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

或者,如果需要字符串:

1
2
3
4
5
import StringIO
sio = StringIO.StringIO()
numpy.savetxt(sio, numpy.arange(10000))
s = sio.getvalue()
print s

默认输出格式为:

1
2
3
4
5
0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
...

它还可以配置其他参数。

在python 2.7.12、numpy 1.11.1上测试。


这是一个小小的修改(删除了向Neoks答案的set_printoptions)传递附加参数的选项)。

它显示了如何使用contextlib.contextmanager以更少的代码行轻松创建这样的ContextManager:

1
2
3
4
5
6
7
8
9
10
11
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)

在代码中可以这样使用:

1
2
3
4
5
6
7
8
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.set_printoptions(threshold=numpy.nan)固定)相辅相成,还限制了要显示的字符数。在一些环境中,比如从bash(而不是交互式会话)调用python时,可以通过如下设置参数linewidth来解决这一问题。

1
2
3
4
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文本并希望在输出窗口中看到结果的用户,应该将构建选项"word_wrap": false添加到Sublime构建文件[源]。


假设你有一个麻木的数组

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

如果要一次性打印整个数组(不切换np.set_printOptions),但要比上下文管理器更简单(代码更少),只需执行

1
2
for row in arr:
     print row


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

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

1
2
3
4
5
6
7
8
9
10
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时,它工作正常。


自numpy版本1.16以来,有关更多详细信息,请参阅github票据12251。

1
2
3
4
from sys import maxsize
from numpy import set_printoptions

set_printoptions(threshold=maxsize)

您可以使用array2string功能-docs。

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

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

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

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

您也可以参考numpy文档numpy文档获得更多帮助。