2014-10-11 13 views
9

मुझे numpy.vectorize फ़ंक्शन के साथ कुछ समस्याएं आ रही हैं।numpy.vectorize गलत मान देता है

मैंने एक ऐसा फ़ंक्शन परिभाषित किया है जो एकल तत्व इनपुट के लिए अच्छी तरह से काम करता है लेकिन वेक्टरिज्ड संस्करण अलग-अलग परिणाम देता है - मैं क्या गलत कर रहा हूं?

कोड:

def c_inf_comp(z): 
    if z>0: 
     return np.exp(-1./(z*z)) 
    else: 
     return 0 


>>> x = np.array([-10., 10.]) 
>>> x 
array([-10., 10.]) 
>>> c_inf_comp(x[0]) 
0 
>>> c_inf_comp(x[1]) 
0.99004983374916811 
>>> vfunz = np.vectorize(c_inf_comp) 
>>> vfunz(x) 
array([0, 0]) 

उत्तर

16

क्योंकि आप otypes निर्दिष्ट नहीं करते हैं (उत्पादन डेटा प्रकार) जब आप अपने समारोह vectorize, NumPy मानता है कि आपके int32 मूल्यों की एक सरणी वापस जाने के लिए चाहते हैं।

दिया जब x vectorized समारोह vfunz पहले -10. देखता है, पूर्णांक 0 देता है, और इसलिए फैसला करता है कि लौटे सरणी के dtypeint32 होना चाहिए।

vfunz = np.vectorize(c_inf_comp, otypes=[np.float]) 

तब आप अपने अपेक्षित परिणाम प्राप्त:

इसे ठीक करने के otypesnp.float मूल्यों होने के लिए निर्दिष्ट

>>> vfunz(x) 
array([ 0.  , 0.99004983]) 

(वैकल्पिक रूप से, के अंक में एक नाव मूल्य लौटने द्वारा निर्धारित किया जा सकता है elsec_inf_comp, यानी return 0.0 की स्थिति। इस तरह, np.vectorize(c_inf_comp) द्वारा उत्पन्न फ़ंक्शन फ्लोट मानों की एक सरणी वापस लौटाएगा, भले ही यह पहले ऋणात्मक संख्या देखे।)

+1

इस छोटे से मुद्दे ने मुझे बहुत समय बर्बाद कर दिया ... यहां स्थिति का वर्णन करने वाला एक और उदाहरण है: https://gist.github.com/drorata/dd9028c993b676328001c414ce822385 – Dror

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