2011-09-26 19 views
28

मैं प्रोग्रामिंग के लिए नया हूं।पायथन रनटाइम चेतावनी: लंबे स्केलर्स में ओवरफ़्लो का सामना करना पड़ा

RuntimeWarning: मेरा नवीनतम अजगर 2.7 परियोजना में मैं निम्नलिखित का सामना करना पड़ा long_scalars

में आई कृपया कोई विस्तृत किया जा सका कि इसका क्या मतलब है और मुझे लगता है कि ठीक करने के लिए क्या कर सकते हैं अतिप्रवाह?

कोड के माध्यम से चलता है, लेकिन मुझे यकीन नहीं है कि चेतावनी को अनदेखा करना एक अच्छा विचार है या नहीं।

यह एक संलग्न की प्रक्रिया के दौरान होता है जैसे:

import numpy as np 
np.seterr(all='warn') 
A = np.array([10]) 
a=A[-1] 
a**a 

पैदावार

RuntimeWarning: overflow encountered in long_scalars 

उपरोक्त उदाहरण यह वजह से होता है:

SomeList.append(VeryLongFormula) 
+3

उपयोग करने के लिए आप कृपया एक [छोटा है, पूर्ण उदाहरण] दिखाने चाहेंगे है (http://sscce.org/) कि इस समस्या को दर्शाता है ? –

+2

आपने numpy टैग शामिल किया था। आपके प्रश्नों में कुछ भी numpy बताता है। आपने कोड शामिल नहीं किया है जो हमें त्रुटि को पुन: उत्पन्न करने की अनुमति देता है। कृपया ऐसा करो। –

+0

http://stackoverflow.com/questions/3767409/python-warning-possibly-numpy – rocksportrocker

उत्तर

33

यहाँ एक उदाहरण है जो एक ही चेतावनी जारी करता है a dtype int32 का है, और maximim v int32 में 2: 31-1 है। 10**10 > 2**32-1 के बाद से, एक्सपोनिएशन परिणाम उस संख्या से बड़ा है जो int32 में संग्रहीत किया जा सकता है।

ध्यान दें कि आप सभी अतिप्रवाह त्रुटियों में त्रुटियों को पकड़ने के लिए np.seterr(all='warn') पर भरोसा नहीं कर सकते हैं। उदाहरण के लिए, पर 32-बिट NumPy

>>> np.multiply.reduce(np.arange(21)+1) 
-1195114496 

जबकि 64-बिट NumPy पर:

>>> np.multiply.reduce(np.arange(21)+1) 
-4249290049419214848 

दोनों, बिना किसी चेतावनी असफल हालांकि यह एक अतिप्रवाह त्रुटि के कारण भी है। सही जवाब यह है कि 21! के बराबर होती है

In [47]: import math 

In [48]: math.factorial(21) 
Out[50]: 51090942171709440000L 

According to numpy developer, Robert Kern,

सच चल बिन्दु त्रुटियों के विपरीत (जहां हार्डवेयर एफपीयू सेट एक झंडा जब भी यह एक परमाणु आपरेशन कि overflows करता है), हम की जरूरत पूर्णांक अतिप्रवाह का पता लगाने को लागू अपने आप को। हम इसे स्केलर पर करते हैं, लेकिन सरणी नहीं करते हैं क्योंकि एरे पर प्रत्येक परमाणु ऑपरेशन के लिए लागू करना बहुत धीमा होगा।

तो बोझ उचित dtypes चुनने के लिए है ताकि कोई ऑपरेशन ओवरफ़्लो न हो।

+2

का संभावित डुप्लिकेट धन्यवाद! मैं परिभाषित कैसे करूं कि मुझे किस प्रकार का टाइप चाहिए? – timkado

+3

आप numpy सरणी बनाते समय 'dtype' सेट कर सकते हैं। उदाहरण के लिए, ऊपर दिए गए मेरे उदाहरण में, आप सेटिंग द्वारा अतिप्रवाह त्रुटि से बच सकते हैं: 'ए = एनपी.एरे ([10], dtype =' int64 ') ' – unutbu

+2

यहां एक [मूलभूत प्रकार की सूची] है (http: // docs.scipy.org/doc/numpy/user/basics.types.html#data-types)। – unutbu

0

इस समस्या को दूर करने के लिए एक आसान तरीका है 64 बिट प्रकार

list = numpy.array(list, dtype=numpy.float64)