2013-09-16 6 views
7

मैं साजिश 'सुपर गाऊसी' कार्यों पैदा करते हैं और करने के लिए अजगर कोड लिख रहा हूँ, के रूप में:AttributeError जब कुछ मूल्यों के लिए समारोह का निर्माण

def supergaussian(x, A, mu, sigma, offset, N=8): 
    """Supergaussian function, amplitude A, centroid mu, st dev sigma, exponent N, with constant offset""" 
    return A * (1/(2**(1+1/N)*sigma*2*scipy.special.gamma(1+1/N))) * numpy.exp(-numpy.absolute(numpy.power(x-mu,N))/(2*sigma**N)) + offset 

init_x = numpy.arange(-100,100,1.0) 
init_y = supergaussian(init_x, 1, 0, 25, 0, N=12) 

के बाद कोड सिर्फ इसके बारे में एक भूखंड बनाता है। एक कारण मैं नहीं जान सकता के लिए, इस कोड ठीक काम करता है जब N के लिए 8 का डिफ़ॉल्ट मान का उपयोग कर, या N अप 13. करने के मूल्यों के लिए जब N 14 या अधिक है, समारोह एक त्रुटि संदेश के साथ दुर्घटनाओं:

AttributeError: 'float' object has no attribute 'exp' 

फ़ंक्शन परिभाषा में वापसी रेखा पर। कोई विचार? उस लाइन का उपयोग करने वाले .EXP numpy.exp त्रुटि संदेश सूचित करते हैं कि numpy एक नाव के रूप में व्याख्या की जा रही है लगता है, लेकिन केवल N के बड़े मूल्यों के लिए में केवल एक चीज है ...

जब से मैं अजगर 3.3 चल रहा हूँ। 2 numpy 1.7.1 और scipy 0.12.0

उत्तर

14

त्रुटि कुछ numpy dtype अजीबता के कारण है। मुझे यकीन है कि वास्तव में कैसे वह आंतरिक रूप से काम करता है नहीं कर रहा हूँ, लेकिन किसी कारण के लिए 2*25**14 में कैसे Numpy डेटाटाइप्स संभालती एक परिवर्तन से चलाता है:

>>> type(np.max(-numpy.absolute(numpy.power(init_x-0,13)))/(2*25**13)) 
<type 'numpy.float64'> 
>>> type(np.max(-numpy.absolute(numpy.power(init_x-0,14)))/(2*25**14)) 
<type 'float'> 
13 के साथ

, यह अभी भी Numpy के float64 प्रकार का उपयोग करता है, लेकिन 14 के साथ यह किसी भी तरह वापस reverts नियमित फ्लोट करने के लिए। यही कारण है कि आप AttributeError प्राप्त करते हैं: एक सामान्य पायथन फ्लोट में exp विधि नहीं है, जो एक numpy ufunc विधि है। (त्रुटि numpy नाम के कारण नहीं है जिसे फ्लोट के रूप में व्याख्या किया जा रहा है। कभी-कभी ये numpy-internal त्रुटियां अनुपयोगी होती हैं कि वे आपको नहीं बताते कि ऑब्जेक्ट में क्या विशेषता नहीं है।)

हालांकि , यह केवल इसलिए हो रहा है क्योंकि 2*25**N एक नियमित पायथन लंबा है, न कि एक numpy डेटाटाइप का मूल्य। आप एक numpy dtype में वह मान पूर्व लपेटकर, इस तरह से इसे ठीक कर सकते हैं:

def supergaussian(x, A, mu, sigma, offset, N=8): 
    """Supergaussian function, amplitude A, centroid mu, st dev sigma, exponent N, with constant offset""" 
    denom = np.float64(2*sigma**N) 
    return A * (1/(2**(1+1/N)*sigma*2*scipy.special.gamma(1+1/N))) * numpy.exp(-numpy.absolute(numpy.power(x-mu,N))/denom) + offset 

अब यह बड़े मूल्यों के लिए ठीक काम करता है।

रूपांतरण विफलता इस तथ्य के कारण प्रतीत होती है कि 2*25**14 एक numpy int64 में फ़िट होने के लिए बहुत बड़ा है। यह मेरे लिए एक बग जैसा दिखता है: यदि यह int64 के लिए बहुत बड़ा है, तो इसे वापस फ्लोट 64 पर गिरना चाहिए या एक त्रुटि उठाना चाहिए, चुपचाप सादे फ्लोट पर वापस नहीं आना चाहिए। ऐसा लगता है कि numpy tracker पर संबंधित बग है, लेकिन यह थोड़ा अलग दिखता है। आप इस मुद्दे को numpy ट्रैकर और/या मेलिंग सूची पर उठाना चाहते हैं।

+0

धन्यवाद, यह वही है जो हो रहा है। मैं numpy ट्रैकर को जमा करूंगा। –

संबंधित मुद्दे