ट्रंकेशन के बिना, पूर्ण न्यूपे सरणी को कैसे प्रिंट करें?


587

जब मैं एक सुपीरियर ऐरे को प्रिंट करता हूं, तो मुझे एक नुकीला प्रतिनिधित्व मिलता है, लेकिन मुझे पूर्ण एरे चाहिए।

क्या इसे करने का कोई तरीका है?

उदाहरण:

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

4
@Matt O'Brien नीचे देखें ZSG का जवाब
user2398029

6
क्या आप अनुशंसित उत्तर को स्वीकार करने के लिए बदल सकते हैं np.inf? np.nanऔर 'nan'केवल कुल अस्थायी द्वारा काम करते हैं, और 'nan'पायथन 3 में भी काम नहीं करता है क्योंकि उन्होंने मिश्रित-प्रकार की तुलना कार्यान्वयन को बदल दिया है जो threshold='nan'उस पर निर्भर था।
user2357112

1
( threshold=np.nanइसके बजाय 'nan'एक अलग फ्लूक पर निर्भर करता है, जो यह है कि सरणी प्रिंटिंग तर्क सरणी आकार की तुलना दहलीज से करता है a.size > _summaryThreshold। यह हमेशा के लिए लौटता Falseहै _summaryThreshold=np.nan। यदि तुलना की गई थी a.size <= _summaryThreshold, तो परीक्षण करना चाहिए कि क्या यह परीक्षण करने के बजाय सरणी को पूरी तरह से मुद्रित किया जाना चाहिए या नहीं। संक्षेप में
कहें

4
इसे करने का एक "एक-बंद" तरीका है: यदि आपके पास tmpबस एक numpy.array है list(tmp)। विभिन्न स्वरूपण के साथ अन्य विकल्प tmp.tolist()अधिक नियंत्रण के लिए या हैं print("\n".join(str(x) for x in tmp))
Travc

जवाबों:


626

उपयोग करें numpy.set_printoptions:

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

2
यदि आप केवल एक numpyबार केवल एक सरणी प्रिंट करना चाहते हैं , तो दुर्भाग्य से इस समाधान में प्रिंट करने के बाद आपको इस कॉन्फ़िगरेशन परिवर्तन को रीसेट करने की आवश्यकता है।
ट्रेवर बॉयड स्मिथ

1
@TrevorBoydSmith, क्या आप जानते हैं कि प्रिंट के बाद इस पैरामीटर को कैसे रीसेट किया जाए?
कॉलिनमैक

1
@ColinMac stackoverflow.com/a/24542498/52074 देखें जहां वह सेटिंग सहेजता है। एक ऑपरेशन करता है। फिर सेटिंग्स को पुनर्स्थापित करता है।
ट्रेवर बॉयड स्मिथ

1
और इसे वापस सामान्य करने के लिए कैसे रीसेट करें?
गुलजार

मैन्युअल रूप से दहलीज आकार में प्रवेश करने का कोई तरीका है?
अमर कुमार

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

मेरा सुझाव है कि np.infइसके बजाय np.nanदूसरों द्वारा सुझाया गया है। वे दोनों आपके उद्देश्य के लिए काम करते हैं, लेकिन दहलीज को "अनन्तता" पर सेट करके आपके कोड को पढ़ने वाले हर व्यक्ति के लिए यह स्पष्ट है कि आपका क्या मतलब है। "एक नंबर नहीं" की दहलीज होने से मुझे थोड़ा अस्पष्ट लगता है।


15
इसका उलटा ऑपरेशन क्या है? पिछली सेटिंग (डॉट्स के साथ) पर वापस कैसे जाएं?
करलो

9
@ कार्लो डिफ़ॉल्ट संख्या 1000 है, इसलिए np.set_printoptions(threshold=1000)इसे डिफ़ॉल्ट व्यवहार पर वापस ले लिया जाएगा। लेकिन आप इस सीमा को अपनी इच्छानुसार कम या अधिक सेट कर सकते हैं। np.set_printoptions(threshold=np.inf)बस एक अधिकतम आकार को मुद्रित करने से पहले अनंत को छोटा करने के लिए अधिकतम आकार बदल सकता है, ताकि यह कभी भी छोटा न हो कि कितना बड़ा है। यदि आप किसी वास्तविक संख्या को सीमा निर्धारित करते हैं तो वह अधिकतम आकार होगा।
पॉलमैग

8
न केवल यह स्पष्ट है, यह बहुत कम नाजुक है। नहीं है कोई विशेष से निपटने के लिए np.inf, np.nanया 'nan'। आप जो भी वहां डालते हैं, NumPy अभी भी एक सादे >का उपयोग करके सरणी के आकार को आपकी दहलीज से तुलना करेगा। np.nanकेवल काम करने के लिए होता है क्योंकि यह a.size > _summaryThresholdइसके बजाय है a.size <= _summaryThreshold, और सभी / / / तुलना के लिए np.nanलौटता है । केवल पायथन 2 के मिश्रित प्रकार के तुलनात्मक तर्क के नाजुक कार्यान्वयन के विवरण के कारण काम करने के लिए होता है; यह पाइथन 3 पर पूरी तरह से टूट जाता हैFalse><>=<='nan'
user2357112

2
मूल्य का उपयोग करें क्योंकि sys.maxsize एक int
Mattip

2
@ कार्लो के प्रश्न का ठीक से उत्तर देने के लिए, ध्यान दें कि प्रिंट विकल्प थ्रेशोल्ड के लिए प्रारंभिक मूल्य पाया जाता है np.get_printoptions()['threshold']। आप थ्रेशोल्ड सेट करने से पहले इस मूल्य को संग्रहीत कर सकते हैं और फिर बाद में इसे पुनर्स्थापित कर सकते हैं (या withअन्य उत्तरों में सुझाए अनुसार ब्लॉक का उपयोग कर सकते हैं )।
१४:१४ पर निंजाकन्नन

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 मैं सहमत हूं ... यह कम त्रुटि वाला प्रवण है जब आपको सिर्फ एक प्रिंट स्टेटमेंट (कोड की एक पंक्ति के लिए 3 लाइनों के विपरीत: परिवर्तन कॉन्फ़िगरेशन, प्रिंट, रीसेट कॉन्फ़िगरेशन) की आवश्यकता होती है।
ट्रेवर बॉयड स्मिथ

मुझे यह पसंद है कि यह अल्पविराम विभाजकों को
छापता है

57

NumPy 1.15 या नया

यदि आप NumPy 1.15 (2018-07-23 को जारी) या नए का उपयोग करते हैं, तो आप printoptionsसंदर्भ प्रबंधक का उपयोग कर सकते हैं :

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

(बेशक, की जगह numpyसे npअगर है कि आप कैसे आयातित numpy)

एक संदर्भ प्रबंधक ( with-ब्लॉक) का उपयोग यह सुनिश्चित करता है कि संदर्भ प्रबंधक के समाप्त होने के बाद, ब्लॉक शुरू होने से पहले वे जो भी थे, प्रिंट विकल्प वापस कर देंगे। यह सुनिश्चित करता है कि सेटिंग अस्थायी है, और केवल ब्लॉक के भीतर कोड के लिए आवेदन किया गया है।

संदर्भ प्रबंधक पर विवरण के लिए 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
ऐसा लगता है कि यह एक संदर्भ प्रबंधक का उपयोग करने के लिए एक अच्छी जगह होगी, इसलिए आप "पूर्णता के साथ" कह सकते हैं।
पॉल प्राइस

8
उपयोग न करें 'nan', np.nanया उपरोक्त में से कोई भी। यह असमर्थित है, और यह बुरी सलाह लोगों के लिए दर्द का कारण बन रही है जो कि अजगर 3 में संक्रमण कर रहे हैं
एरिक

1
@ZSG बदलें लाइन 5 के साथnumpy.set_printoptions(threshold=numpy.inf)
निर्मल

धन्यवाद @ निर्मल, मैंने इस 2014 के उत्तर को संपादित किया इसलिए यह आज काम करता है।
पॉल रूजियक्स

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 , नाम के तहत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 सरणी कैसे प्रिंट करें?

पायथन 2.7.12 पर परीक्षण किया गया, सुन्न 1.11.1।


1
इस विधि में मामूली कमी यह है कि केवल 1d और 2d सरणियों के साथ काम करता है
Fnord

@ इस जानकारी के लिए धन्यवाद, मुझे पता है अगर तुम एक वैकल्पिक हल मिल!
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '15

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
आपको हमेशा एक संदर्भ प्रबंधक में try/ finallyआस - पास रखना चाहिए yield, ताकि क्लीनअप कोई फर्क न पड़े।
एरिक

1
@ वास्तव में। आपकी मददगार टिप्पणी के लिए धन्यवाद और मैंने जवाब अपडेट कर दिया है।
MSeifert

1.15 में, यह वर्तनी हो सकती हैwith np.printoptions(threshold=np.inf):
एरिक

6

कॉलम (अधिकतम के साथ तय ) की संख्या से इस उत्तर के पूरक numpy.set_printoptions(threshold=numpy.nan), प्रदर्शित किए जाने वाले वर्णों की एक सीमा भी है। कुछ वातावरणों में जैसे बैश से पाइथन बुलाना (इंटरेक्टिव सेशन के बजाय), यह 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)

यह मेरे लिए काम करता है (जुपिटर पाइथन संस्करण 3)। आप नीचे दिए गए कोड की कोशिश कर सकते हैं। आधिकारिक डॉक्यूमेंटेशन के अनुसार नीचे दिए गए कोड को डिफ़ॉल्ट विकल्पों पर वापस रखना चाहिए। जो मेरे लिए भी किया। > np.set_printoptions (धारिता = 3, infstr = 'inf', linewidth = 75, nanstr = 'nan', परिशुद्धता = 8, दमन = असत्य, दहलीज = 1000,
सूत्रकार

ठीक है, यह होना चाहिए क्योंकि मैं जुपिटर का उपयोग नहीं कर रहा हूं। स्वीकृत उत्तर मेरे लिए शुद्ध अजगर वातावरण में काम करता है।
मथायॉ

इसका मतलब है threshold=0, जिसका अर्थ है "जितनी जल्दी हो सके" - बिल्कुल भी नहीं जो आप चाहते हैं।
एरिक

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 का डिफ़ॉल्ट लिनिविड)। किसी भी मूल्य का उपयोग करें जिसे आप लिनिविड के लिए पसंद करते हैं जो आपके कोडिंग वातावरण के अनुरूप है। यह आपको प्रति पंक्ति अधिक वर्ण जोड़कर बड़ी संख्या में आउटपुट लाइनों से गुजरने से बचाएगा।



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या उपरोक्त में से कोई भी। यह असमर्थित है, और यह बुरी सलाह लोगों के लिए दर्द का कारण बन रही है जो कि अजगर 3 में संक्रमण कर रहे हैं
एरिक

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.