วิธีการพิมพ์อาร์เรย์ NumPy เต็มรูปแบบโดยไม่ต้องตัดทอน?


589

เมื่อฉันพิมพ์อาร์เรย์ 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
มีวิธีที่จะทำบนพื้นฐาน "one off" หรือไม่? นั่นคือเพื่อพิมพ์เอาต์พุตเต็มหนึ่งครั้ง แต่ไม่ใช่เวลาอื่นในสคริปต์?
tumultous_rooster

4
@Matt O'Brien ดูคำตอบของ ZSG ด้านล่าง
user2398029

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 "one-off" วิธีการทำ: หากคุณมี numpy.array เพียงtmp list(tmp)ตัวเลือกอื่น ๆ ที่มีการจัดรูปแบบที่แตกต่างกันหรือการควบคุมมากขึ้นtmp.tolist() print("\n".join(str(x) for x in tmp))
travc

คำตอบ:


629

การใช้numpy.set_printoptions:

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

2
หากคุณต้องการพิมพ์numpyอาเรย์เพียงครั้งเดียว แต่น่าเสียดายที่โซลูชันนี้มีข้อเสียที่ทำให้คุณต้องรีเซ็ตการเปลี่ยนแปลงการกำหนดค่านี้หลังจากทำการพิมพ์
เทรเวอร์บอยด์สมิ ธ

1
@TrevorBoydSmith คุณรู้วิธีรีเซ็ตพารามิเตอร์นี้หลังจากพิมพ์หรือไม่
ColinMac

1
@ColinMac ดูstackoverflow.com/a/24542498/52074ที่เขาบันทึกการตั้งค่า ไม่ดำเนินการ จากนั้นเรียกคืนการตั้งค่า
เทรเวอร์บอยด์สมิ ธ

1
และวิธีการรีเซ็ตมันกลับเป็นปกติ?
Gulzar

มีวิธีใดบ้างในการป้อนขนาดเกณฑ์ด้วยตนเอง
Amar Kumar

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

ฉันแนะนำให้ใช้np.infแทนnp.nanสิ่งที่คนอื่นแนะนำ ทั้งสองทำงานเพื่อจุดประสงค์ของคุณ แต่โดยการตั้งค่าขีด จำกัด เป็น "ไม่มีที่สิ้นสุด" จะเห็นได้ชัดว่าทุกคนอ่านโค้ดของคุณว่าคุณหมายถึงอะไร การมีเกณฑ์ "ไม่เป็นตัวเลข" ดูเหมือนจะคลุมเครือเล็กน้อยสำหรับฉัน


15
การดำเนินการผกผันของสิ่งนี้คืออะไร? จะกลับไปสู่การตั้งค่าก่อนหน้า (ด้วยจุด) ได้อย่างไร?
Karlo

9
@Karlo จำนวนเริ่มต้นคือ 1,000 ดังนั้นnp.set_printoptions(threshold=1000)จะเปลี่ยนกลับไปเป็นพฤติกรรมเริ่มต้น แต่คุณสามารถตั้งค่าขีด จำกัด นี้ต่ำหรือสูงได้ตามต้องการ np.set_printoptions(threshold=np.inf)เพียงแค่เปลี่ยนขนาดสูงสุดที่อาเรย์ที่พิมพ์สามารถทำได้ก่อนที่มันจะถูกตัดให้ไม่มีที่สิ้นสุดดังนั้นมันจึงไม่ถูกตัดทอนไม่ว่าจะใหญ่แค่ไหน หากคุณตั้งค่าขีด จำกัด เป็นจำนวนจริงใด ๆ นั่นจะเป็นขนาดสูงสุด
PaulMag

8
ชัดเจนยิ่งขึ้นไม่เพียง แต่มันจะบอบบางน้อยกว่ามาก นอกจากนี้ไม่มีการจัดการพิเศษสำหรับnp.inf, หรือnp.nan 'nan'สิ่งที่คุณใส่ไว้ที่นั่น NumPy จะยังคงใช้แบบธรรมดา>เพื่อเปรียบเทียบขนาดของอาร์เรย์กับขีด จำกัด ของคุณ np.nanเกิดขึ้นกับการทำงานเพียงเพราะมันa.size > _summaryThresholdแทนa.size <= _summaryThresholdและnp.nanผลตอบแทนFalseสำหรับ>/ </ >=/ <=เปรียบเทียบทั้งหมด 'nan'เกิดขึ้นกับการทำงานเนื่องจากรายละเอียดการใช้งานที่บอบบางของตรรกะการเปรียบเทียบแบบผสมของ Python 2 มันหยุดอย่างสมบูรณ์ใน Python 3
user2357112 รองรับ Monica

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
นี่เป็นวิธีที่ดีที่สุดในการดูอาร์เรย์ทั้งหมดของคุณในคำสั่งพิมพ์
Aaron Bramson

@AaronBramson ฉันเห็นด้วย ... นี่เป็นข้อผิดพลาดน้อยที่เกิดขึ้นได้ง่ายเมื่อคุณต้องการคำสั่งพิมพ์เพียงชุดเดียว (รหัสหนึ่งบรรทัดตรงข้ามกับ 3 บรรทัดสำหรับ: เปลี่ยนการกำหนดค่าการพิมพ์การตั้งค่าการรีเซ็ต)
เทรเวอร์บอยด์สมิ ธ

ฉันชอบสิ่งนี้พิมพ์ตัวคั่นจุลภาค
Ob ชัดChild

57

NumPy 1.15 หรือใหม่กว่า

ถ้าคุณใช้ NumPy 1.15 (เผยแพร่ 2018-07-23) หรือใหม่กว่าคุณสามารถใช้ตัวprintoptionsจัดการบริบท:

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

(แน่นอนแทนที่numpyด้วยnpถ้าเป็นวิธีที่คุณนำเข้าnumpy)

การใช้ตัวจัดการบริบท ( 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
Eric

ใช่ส่วนหนึ่งของการสอน 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

ใช้ตัวจัดการบริบทเป็นPaul Price อย่างยิ่ง

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
ตัวจัดการบริบทนี้สร้างขึ้นในจำนวน 1.15 ขอบคุณgithub.com/numpy/numpy/pull/10406ภายใต้ชื่อnp.printoptions
เอริค

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, จำนวน 1.11.1


1
ข้อเสียเปรียบเล็กน้อยสำหรับวิธีนี้คือใช้ได้กับอาร์เรย์ 1d และ 2d เท่านั้น
Fnord

@ ฟอร์ดขอบคุณสำหรับข้อมูลนี้โปรดแจ้งให้เราทราบหากคุณพบวิธีแก้ปัญหา!
Ciro Santilli 郝海东冠状病六四事件法轮功

10

นี่คือการปรับเปลี่ยนเล็กน้อย (ลบตัวเลือกเพื่อส่งผ่านอาร์กิวเมนต์เพิ่มเติมไปยังset_printoptions)ของคำตอบของneok

มันแสดงให้เห็นว่าคุณสามารถใช้contextlib.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
คุณควรใส่ a try/ finallyรอบ ๆyieldในตัวจัดการบริบทเพื่อให้การล้างข้อมูลเกิดขึ้นไม่ว่าจะเกิดอะไรขึ้น
Eric

1
@Eric แน่นอน ขอบคุณสำหรับความคิดเห็นที่เป็นประโยชน์และฉันได้อัปเดตคำตอบแล้ว
MSeifert

ใน 1.15 นี้สามารถสะกดได้with np.printoptions(threshold=np.inf):
Eric

6

ประกอบกับคำตอบนี้จากจำนวนคอลัมน์สูงสุด (แก้ไขด้วยnumpy.set_printoptions(threshold=numpy.nan)) นอกจากนี้ยังมีการ จำกัด จำนวนอักขระที่จะแสดง ในบางสภาพแวดล้อมเช่นเมื่อเรียก python จาก bash (แทนที่จะเป็นเซสชันแบบโต้ตอบ) สิ่งนี้สามารถแก้ไขได้โดยการตั้งค่าพารามิเตอร์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)

ในกรณีนี้หน้าต่างของคุณควร จำกัด จำนวนตัวอักษรเพื่อตัดบรรทัด

สำหรับผู้ที่อยู่ที่นั่นโดยใช้ข้อความประเสริฐและต้องการเห็นผลลัพธ์ภายในหน้าต่างเอาท์พุทคุณควรเพิ่มตัวเลือก"word_wrap": falseบิลด์ลงในไฟล์ซับเลมบิลด์ [ แหล่งที่มา ]



4

เพื่อปิดและกลับสู่โหมดปกติ

np.set_printoptions(threshold=False)

มันใช้งานได้สำหรับฉัน (Jupyter หลามรุ่น 3) คุณอาจลองใช้รหัสด้านล่างตามเอกสารทางการอย่างเป็นทางการรหัสด้านล่างควรกลับไปที่ตัวเลือกเริ่มต้น ซึ่งมันก็ทำเพื่อฉันเช่นกัน > np.set_printoptions (edgeitems = 3, infstr = 'inf', linewidth = 75, nanstr = 'nan', ความแม่นยำ = 8, ปราบปราม = False, threshold = 1,000, formatter = None)
ewalel

ต้องเป็นเพราะฉันไม่ได้ใช้ Jupyter คำตอบที่ได้รับการยอมรับนั้นใช้ได้ผลสำหรับฉันในสภาพแวดล้อมแบบหลาม ๆ
Mathyou

วิธีนี้threshold=0ซึ่งหมายความว่า "ตัดเร็วที่สุดเท่าที่เป็นไปได้" - ไม่สิ่งที่คุณต้องการในทุก
Eric

2

สมมติว่าคุณมีอาร์เรย์ที่มีจำนวนมาก

 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) ใช้ค่าที่คุณต้องการสำหรับ linewidth ที่เหมาะสมกับสภาพแวดล้อมการเขียนโค้ดของคุณ สิ่งนี้จะช่วยให้คุณไม่ต้องผ่านสายออกจำนวนมากโดยการเพิ่มตัวอักษรต่อบรรทัด


1

คุณสามารถใช้array2stringฟังก์ชั่น - เอกสาร

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

คุณจะไม่ต้องการพิมพ์ทุกรายการโดยเฉพาะอย่างยิ่งสำหรับอาร์เรย์ขนาดใหญ่

วิธีง่ายๆในการแสดงรายการเพิ่มเติม:

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)

นอกจากนี้คุณยังสามารถอ้างอิงเอกสาร คู่มือการใช้งานจำนวนมากสำหรับ "หรือส่วน"เพื่อขอความช่วยเหลือเพิ่มเติม


3
อย่าใช้'nan', np.nanหรือใด ๆ ข้างต้น มันไม่ได้รับการสนับสนุนและคำแนะนำที่ไม่ดีนี้ทำให้เกิดความเจ็บปวดสำหรับผู้ที่เปลี่ยนมาใช้ python 3
Eric

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.