2017-10-08 4 views
0

Je souhaite créer une sous-classe de scipy.stats.rv_discrete pour ajouter des méthodes supplémentaires. Toutefois, lorsque j'essaie d'accéder à la méthode pmf() de la sous-classe, une erreur est générée. S'il vous plaît voir l'exemple suivant:L'instance de sous-classe scipy.stats.rv_discrete génère une erreur sur la méthode 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) 

Il en résulte:

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' 

Malgré cela, si je l'utilise directement stats.rv_discrete, tout va bien:

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

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

Répondre

0

@josef-PKT La réponse sur github est donnée ci-dessous:

passant par le sous-classement régulier crée une classe rv_sample et n'init pas la bonne classe

les œuvres suivantes pour moi avec 0.18.1 (que j'ai ouvert en ce moment)

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__) 

peut-être ce sera corrigé dans d'autres versions scipy ...