【问题标题】:Instance of scipy.stats.rv_discrete subclass throws error on pmf() methodscipy.stats.rv_discrete 子类的实例在 pmf() 方法上抛出错误
【发布时间】:2018-03-20 00:50:03
【问题描述】:

我想创建一个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])

【问题讨论】:

    标签: python scipy statistics


    【解决方案1】:

    @josef-pktgithub的回答如下:

    通过常规子类化会创建一个 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 版本中得到修复...

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2019-08-11
      • 2015-07-10
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多