Làm thế nào để in toàn bộ mảng NumPy mà không cần cắt bớt?


589

Khi tôi in một mảng numpy, tôi nhận được một đại diện cắt ngắn, nhưng tôi muốn mảng đầy đủ.

Có cách nào để làm điều này?

Ví dụ:

>>> 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
Có cách nào để làm điều đó trên cơ sở "một lần" không? Đó là, để in ra toàn bộ đầu ra một lần, nhưng không phải lúc khác trong kịch bản?
tumultous_rooster

4
@Matt O'Brien xem câu trả lời của ZSG bên dưới
user2398029

6
Bạn có thể thay đổi câu trả lời được chấp nhận cho một đề nghị np.inf? np.nan'nan'chỉ hoạt động theo tổng số sán, và 'nan'thậm chí không hoạt động trong Python 3 vì chúng đã thay đổi triển khai so sánh kiểu hỗn hợp threshold='nan'phụ thuộc vào.
user2357112 hỗ trợ Monica

1
( threshold=np.nanChứ không phải 'nan'phụ thuộc vào một sự may mắn khác nhau, đó là logic in mảng so sánh kích thước mảng đến ngưỡng với a.size > _summaryThreshold. Đây luôn lợi nhuận Falsecho _summaryThreshold=np.nan. Nếu so sánh đã a.size <= _summaryThreshold, thử nghiệm liệu mảng sẽ được in đầy đủ thay vì thử nghiệm cho dù đó nên được tóm tắt, ngưỡng này sẽ kích hoạt tóm tắt cho tất cả các mảng.)
user2357112 hỗ trợ Monica

4
Một cách làm "một lần": Nếu bạn có một numpy.array tmpchỉ list(tmp). Các tùy chọn khác với định dạng khác nhau tmp.tolist()hoặc để kiểm soát nhiều hơn print("\n".join(str(x) for x in tmp)).
travc

Câu trả lời:


629

Sử dụng numpy.set_printoptions:

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

2
nếu bạn chỉ muốn in một numpymảng chỉ một lần, thật không may, giải pháp này có nhược điểm là yêu cầu bạn đặt lại thay đổi cấu hình này sau khi thực hiện in.
Trevor Boyd Smith

1
@TrevorBoydSmith, Bạn có biết cách đặt lại tham số này sau khi in không?
ColinMac

1
@ColinMac xem stackoverflow.com/a/24542498/52074 nơi anh lưu cài đặt. thực hiện một hoạt động. sau đó khôi phục cài đặt.
Trevor Boyd Smith

1
Và làm thế nào để thiết lập lại nó trở lại bình thường?
Gulzar

Có cách nào để nhập kích thước ngưỡng bằng tay không?
Amar Kumar

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

Tôi đề nghị sử dụng np.infthay vì np.nanđược đề xuất bởi những người khác. Cả hai đều hoạt động cho mục đích của bạn, nhưng bằng cách đặt ngưỡng thành "vô cực", rõ ràng mọi người đọc mã của bạn là gì. Có một ngưỡng "không phải là số" có vẻ hơi mơ hồ đối với tôi.


15
Hoạt động nghịch đảo này là gì? Làm cách nào để quay lại cài đặt trước đó (có dấu chấm)?
Karlo

9
@Karlo Số mặc định là 1000, vì vậy np.set_printoptions(threshold=1000)sẽ hoàn nguyên nó về hành vi mặc định. Nhưng bạn có thể đặt ngưỡng này thấp hoặc cao tùy thích. np.set_printoptions(threshold=np.inf)chỉ cần thay đổi kích thước tối đa mà một mảng in có thể được cắt trước khi nó bị cắt thành vô hạn, để nó không bao giờ bị cắt bớt cho dù lớn đến đâu. Nếu bạn đặt ngưỡng cho bất kỳ số thực nào thì đó sẽ là kích thước tối đa.
PaulMag

8
Không chỉ rõ ràng hơn, nó còn dễ vỡ hơn nhiều. Có không xử lý đặc biệt cho np.inf, np.nanhoặc 'nan'. Dù bạn đặt ở đó, NumPy vẫn sẽ sử dụng đồng bằng >để so sánh kích thước của mảng với ngưỡng của bạn. np.nanchỉ xảy ra để làm việc vì nó a.size > _summaryThresholdthay vì a.size <= _summaryThresholdnp.nantrả về Falsecho tất cả >/ </ >=/ <=so sánh. 'nan'chỉ xảy ra để làm việc do các chi tiết triển khai dễ vỡ của logic so sánh kiểu hỗn hợp của Python 2; nó phá vỡ hoàn toàn trên Python 3.
user2357112 hỗ trợ Monica

2
Sử dụng sys.maxsize vì giá trị được ghi là int
mattip

2
Để trả lời đúng câu hỏi của @ Karlo, lưu ý rằng giá trị ban đầu cho ngưỡng tùy chọn in được tìm thấy trong np.get_printoptions()['threshold']. Bạn có thể lưu trữ giá trị này trước khi đặt ngưỡng và sau đó khôi phục giá trị đó (hoặc sử dụng một withkhối như được đề xuất trong các câu trả lời khác).
Ninjakannon

94

Các câu trả lời trước là câu trả lời đúng, nhưng như một cách thay thế yếu hơn, bạn có thể chuyển đổi thành một danh sách:

>>> 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
Đây dường như là cách một lần tốt nhất để xem toàn bộ mảng của bạn trong một câu lệnh in.
Aaron Bramson

@AaronBramson tôi đồng ý ... đây là lỗi ít xảy ra khi bạn chỉ cần một câu lệnh in (một dòng mã trái ngược với 3 dòng cho: thay đổi cấu hình, in, đặt lại cấu hình).
Trevor Boyd Smith

Tôi thích điều này in dấu phân cách dấu phẩy
Rõ ràngChild

58

NumPy 1.15 trở lên

Nếu bạn sử dụng NumPy 1.15 (phát hành 2018-07-23) hoặc mới hơn, bạn có thể sử dụng trình printoptionsquản lý bối cảnh:

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

(tất nhiên, thay thế numpybằng npnếu đó là cách bạn nhập numpy)

Việc sử dụng trình quản lý bối cảnh ( with-block) đảm bảo rằng sau khi trình quản lý bối cảnh kết thúc, các tùy chọn in sẽ trở lại bất cứ thứ gì trước khi khối bắt đầu. Nó đảm bảo cài đặt là tạm thời và chỉ được áp dụng cho mã trong khối.

Xem numpy.printoptionstài liệu để biết chi tiết về trình quản lý bối cảnh và những đối số khác mà nó hỗ trợ.


41

Điều này có vẻ như bạn đang sử dụng numpy.

Nếu đó là trường hợp, bạn có thể thêm:

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

Điều đó sẽ vô hiệu hóa in góc. Để biết thêm thông tin, hãy xem Hướng dẫn NumPy này .


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

Vâng, đó là một phần của hướng dẫn chính thức của Numpy là sai
aderchox

36

Đây là một cách duy nhất để làm điều này, rất hữu ích nếu bạn không muốn thay đổi cài đặt mặc định của mình:

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
Có vẻ như đây sẽ là một nơi tốt để sử dụng trình quản lý bối cảnh, vì vậy bạn có thể nói "với đầy đủ".
Paul Giá

8
Không sử dụng 'nan', np.nanhoặc bất kỳ điều nào ở trên. Nó không được hỗ trợ, và lời khuyên tồi tệ này đang gây đau đớn cho những người chuyển sang python 3
Eric

1
@ZSG Thay thế dòng 5 bằngnumpy.set_printoptions(threshold=numpy.inf)
Nirmal

Cảm ơn @Nirmal, tôi đã chỉnh sửa câu trả lời năm 2014 này để nó hoạt động ngày hôm nay.
Paul Rougieux

31

Sử dụng một trình quản lý bối cảnh như Paul Price đã cố gắng

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
Trình quản lý bối cảnh này được xây dựng thành numpy 1.15, nhờ github.com/numpy/numpy/pull/10406 , dưới tênnp.printoptions
Eric

13

numpy.savetxt

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

hoặc nếu bạn cần một chuỗi:

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

Định dạng đầu ra mặc định là:

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

và nó có thể được cấu hình với các đối số hơn nữa.

Đặc biệt lưu ý cách này cũng không hiển thị dấu ngoặc vuông và cho phép nhiều tùy chỉnh, như đã đề cập tại: Làm thế nào để in một mảng Numpy mà không có dấu ngoặc?

Đã thử nghiệm trên Python 2.7.12, numpy 1.11.1.


1
Hạn chế nhỏ của phương pháp này là chỉ hoạt động với mảng 1d và 2d
Fnord

@Fnord cảm ơn vì thông tin này, hãy cho tôi biết nếu bạn tìm thấy cách giải quyết!
Ciro Santilli 郝海东 冠状 病 事件

10

Đây là một sửa đổi nhỏ (loại bỏ tùy chọn để chuyển các đối số bổ sung cho câu trả lời set_printoptions)của neok .

Nó cho thấy cách bạn có thể sử dụng contextlib.contextmanagerđể dễ dàng tạo một bối cảnh như vậy với ít dòng mã hơn:

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)

Trong mã của bạn, nó có thể được sử dụng như thế này:

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
Bạn nên luôn luôn đặt một try/ finallyxung quanh yieldtrong một trình quản lý bối cảnh, để việc dọn dẹp xảy ra bất kể điều gì.
Eric

1
@Eric thật đấy. Cảm ơn bạn đã bình luận hữu ích của bạn và tôi đã cập nhật câu trả lời.
MSeifert

Trong 1.15, điều này có thể được đánh vầnwith np.printoptions(threshold=np.inf):
Eric

6

Bổ sung cho câu trả lời này từ số lượng cột tối đa (cố định với numpy.set_printoptions(threshold=numpy.nan)), cũng có giới hạn các ký tự được hiển thị. Trong một số môi trường như khi gọi python từ bash (thay vì phiên tương tác), điều này có thể được khắc phục bằng cách đặt tham số linewidthnhư sau.

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)

Trong trường hợp này, cửa sổ của bạn nên giới hạn số lượng ký tự để ngắt dòng.

Đối với những người sử dụng văn bản siêu phàm và muốn xem kết quả trong cửa sổ đầu ra, bạn nên thêm tùy chọn "word_wrap": falsexây dựng vào tệp xây dựng siêu phàm [ nguồn ].


4

Kể từ NumPy phiên bản 1.16, để biết thêm chi tiết, xem vé GitHub 12251 .

from sys import maxsize
from numpy import set_printoptions

set_printoptions(threshold=maxsize)

4

Để tắt và trở về chế độ bình thường

np.set_printoptions(threshold=False)

Nó hoạt động với tôi (Jupyter python phiên bản 3). Bạn có thể thử mã bên dưới. Theo tài liệu chính thức, mã bên dưới sẽ đưa trở lại các tùy chọn mặc định. Mà nó đã làm cho tôi quá. > np.set_printoptions (edgeitems = 3, infstr = 'inf', line thong = 75, nanstr = 'nan', precision = 8, booster = false, ngưỡng = 1000, formatter = none)
ewalel 17/07/19

Được rồi, chắc là do tôi không sử dụng Jupyter. Câu trả lời được chấp nhận làm việc cho tôi trong một môi trường trăn thuần túy.
Mathyou

Điều này có nghĩa threshold=0, có nghĩa là "cắt ngắn càng sớm càng tốt" - không phải là những gì bạn muốn.
Eric

2

Giả sử bạn có một mảng numpy

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

Nếu bạn muốn in toàn bộ mảng theo cách một lần (không bật np.set_printoptions), nhưng muốn một cái gì đó đơn giản hơn (ít mã hơn) so với trình quản lý bối cảnh, chỉ cần làm

for row in arr:
     print row 

2

Một sửa đổi nhỏ: (vì bạn sẽ in một danh sách lớn)

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

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

Điều này sẽ tăng số lượng ký tự trên mỗi dòng (băng thông mặc định là 75). Sử dụng bất kỳ giá trị nào bạn thích cho băng thông phù hợp với môi trường mã hóa của bạn. Điều này sẽ giúp bạn không phải trải qua số lượng lớn các dòng đầu ra bằng cách thêm nhiều ký tự trên mỗi dòng.


1

Bạn có thể sử dụng array2stringchức năng - tài liệu .

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

Bạn sẽ không luôn muốn tất cả các mục được in, đặc biệt là cho các mảng lớn.

Một cách đơn giản để hiển thị nhiều mục hơn:

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

Nó hoạt động tốt khi được cắt lát <1000 theo mặc định.


0

Nếu bạn có sẵn gấu trúc,

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

tránh tác dụng phụ của việc yêu cầu thiết lập lại numpy.set_printoptions(threshold=sys.maxsize)và bạn không nhận được numpy.array và ngoặc. Tôi thấy điều này thuận tiện cho việc bỏ một mảng rộng vào một tệp nhật ký


-1

Nếu một mảng quá lớn để in, NumPy sẽ tự động bỏ qua phần trung tâm của mảng và chỉ in các góc: Để vô hiệu hóa hành vi này và buộc NumPy phải in toàn bộ mảng, bạn có thể thay đổi các tùy chọn in bằng cách sử dụng set_printoptions.

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

hoặc là

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

Bạn cũng có thể tham khảo tài liệu numpy tài liệu numpy cho "hoặc một phần" để được trợ giúp thêm.


3
Không sử dụng 'nan', np.nanhoặc bất kỳ điều nào ở trên. Nó không được hỗ trợ, và lời khuyên tồi tệ này đang gây đau đớn cho những người chuyển sang dùng trăn 3
Eric

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.