2017-10-08 85 views
0

我想创建一个scipy.stats.rv_discrete的子类来添加一些其他方法。但是,当我尝试访问子类的pmf()方法时,会引发错误。请看下面的例子:scipy.stats.rv_discrete子类的实例在pmf()方法上抛出错误

import numpy as np 
from scipy import stats 

class sub_rv_discrete(stats.rv_discrete): 
    pass 

xk = np.arange(2) 
pk = (0.5, 0.5) 

instance_subclass = sub_rv_discrete(values=(xk, pk)) 
instance_subclass.pmf(xk) 

这导致:

Traceback (most recent call last): 

    File "<ipython-input-48-129655c38e6a>", line 11, in <module> 
    instance.pmf(xk) 

    File "C:\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py", line 2832, in pmf 
    args, loc, _ = self._parse_args(*args, **kwds) 

AttributeError: 'rv_sample' object has no attribute '_parse_args' 

尽管如此,如果我直接使用stats.rv_discrete,一切都很好:

instance_class = stats.rv_discrete(values=(xk, pk)) 
instance_class.pmf(xk) 

---> array([ 0.5, 0.5]) 

回答

0

@约瑟夫 - PKT关于github的回答如下:

通过正规子类去创建一个rv_sample类,不初始化正确的类

以下作品我0.18.1(我有开放的现在)

from scipy.stats._distn_infrastructure import rv_sample 

class subc_rv_discrete(rv_sample): 

def __new__(cls, *args, **kwds): 
    return super(subc_rv_discrete, cls).__new__(cls) 

xk = [0,1,2,3] 
pk = [0.1, 0.2, 0.3, 0.4] 

inst = subc_rv_discrete(values=(xk, pk)) 
print(inst.pmf(xk)) 
print(inst.__class__) 

也许这将在更多的scipy发布中得到修复...