समस्या तब उत्पन्न होती है जब अस्तित्व समारोह में पहला कॉल उस सीमा में होता है जो स्पष्ट रूप से शून्य होना चाहिए (पिछले उत्तर में मेरी टिप्पणी देखें)। उदा।, Hypergeom.sf (x, एम, एन, एन) पर कॉल के लिए यह विफल रहता है अगर फ़ंक्शन में हाइपरजैमेट्रिक फ़ंक्शन पर पहली कॉल एक ऐसी स्थिति है जहां x> n, जहां अस्तित्व कार्य हमेशा शून्य होगा।
आप तुच्छता द्वारा अस्थायी रूप से इसे ठीक कर सकता है: अब
def new_hypergeom_sf(k, *args, **kwds):
from scipy.stats import hypergeom
(M, n, N) = args[0:3]
try:
return hypergeom.sf(k, *args, **kwds)
except Exception as inst:
if k >= n and type(inst) == IndexError:
return 0 ## or conversely 1 - hypergeom.cdf(k, *args, **kwds)
else:
raise inst
आप कोई समस्या नहीं संपादन /usr/share/pyshared/scipy/stats/distributions.py (या समतुल्य फ़ाइल) है, ठीक लाइन 3966 जहां अभी इसे पढ़ता है पर संभावना है:
place(output,cond,self._sf(*goodargs))
if output.ndim == 0:
return output[()]
return output
लेकिन आप बदल देते हैं तो:
if output.ndim == 0:
return output[()]
place(output,cond,self._sf(*goodargs))
if output.ndim == 0:
return output[()]
return output
अब यह इंडेक्स त्रुटि के बिना काम करता है। असल में यदि आउटपुट शून्य आयामी है क्योंकि यह चेक विफल रहता है, तो यह स्थान कॉल करने में विफल रहता है, विफल रहता है, और वितरण उत्पन्न नहीं करता है। (ऐसा तब नहीं होता है जब कोई पिछला वितरण पहले से ही बनाया जा चुका है, संभवतः यह पहले परीक्षणों पर क्यों नहीं पकड़ा गया था।) ध्यान दें कि जगह (numpy के function_base.py में परिभाषित) सरणी के तत्वों को बदल देगा (हालांकि मैं हूं सुनिश्चित नहीं है कि यह आयामता को बदलता है) तो यह भी हो सकता है कि यह अभी भी स्थान के बाद 0 मंद जांच छोड़ दे। मैंने यह देखने के लिए पूरी तरह से परीक्षण नहीं किया है कि यह परिवर्तन कुछ और तोड़ता है (और यह सभी असतत यादृच्छिक परिवर्तनीय वितरण पर लागू होता है), तो शायद यह पहला फिक्स करने के लिए सबसे अच्छा हो सकता है।
यह इसे तोड़ देता है; उदाहरण के लिए, figures.hypergeom.sf (1,10,2,5) शून्य के रूप में लौटाता है (2/9 के बजाय)।
इस सुधार में काफी बेहतर काम करने के लिए, एक ही अनुभाग में लगता है:
class rv_discrete(rv_generic):
...
def sf(self, k, *args, **kwds):
...
if any(cond):
place(output,cond,self._sf(*goodargs))
if output.ndim == 0:
return output[()]
return output
यह डेबियन पर अजगर 2.6.6 पर एक ही करता है। – eumiro
जो भी इसके लायक है, ऐसा लगता है कि यह एक बग हो सकता है, और इसलिए स्पष्ट रूप से उपयोगकर्ताओं की सूची पर बेहतर पूछा जा सकता है: http://mail.scipy.org/mailman/listinfo/scipy-user यह अधिक होने की संभावना है वहां देवों का ध्यान ... –
मैंने इसके लिए टिकट खोला: http://projects.scipy.org/scipy/ticket/1291। जैसा कि जो किंगटन ने उल्लेख किया है, मेलिंग सूची या पैकेज के बग ट्रैकर को बग या अप्रत्याशित व्यवहार की रिपोर्ट करना उपयोगी होगा। – user333700