微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy 中的广播错误,但数组的形状相同

如何解决scipy 中的广播错误,但数组的形状相同

我正在尝试使用 scipy 统计函数

prior = scipy.stats.truncnorm.pdf(x,a,b,loc=loc,scale=scale)

我收到以下错误

<ipython-input-32-9c0390b95343> in prior(values1,values2)
     69     # line 6352 return _norm_pdf(x) / self._delta
     70     prior = scipy.stats.truncnorm.pdf(x,---> 71                                       loc=loc,scale=scale)
     72 

/opt/anaconda3/envs/pymc3/lib/python3.6/site-packages/scipy/stats/_distn_infrastructure.py in pdf(self,x,*args,**kwds)
   1669             goodargs = argsreduce(cond,*((x,)+args+(scale,)))
   1670             scale,goodargs = goodargs[-1],goodargs[:-1]
-> 1671             place(output,cond,self._pdf(*goodargs) / scale)
   1672         if output.ndim == 0:
   1673             return output[()]

/opt/anaconda3/envs/pymc3/lib/python3.6/site-packages/scipy/stats/_continuous_distns.py in _pdf(self,b)
   6350 
   6351     def _pdf(self,b):
-> 6352         return _norm_pdf(x) / self._delta
   6353 
   6354     def _logpdf(self,b):

ValueError: operands Could not be broadcast together with shapes (4084,) (4100,) 

但是数组都是相同的形状。当我在调用 truncnorm.pdf 之前放入打印语句时,

print(x.shape,a.shape,b.shape,loc.shape,scale.shape)
prior = scipy.stats.truncnorm.pdf(x,scale=scale)

我明白了,

(4100,)

确认。

我按照在 _continuous_distns.py 文件中计算截断法线的 pdf 的过程尝试为自己重新创建它,看看是否发生了某些事情来在内部屏蔽其中一个数组,

import scipy.special as sc

def norm_cdf(x):
    return sc.ndtr(x)

def norm_sf(x):
    return norm_cdf(-x)

nb = norm_cdf(b)
na = norm_cdf(a)
sb = norm_sf(b)
sa = norm_sf(a)

# line 6345 - 6347,defining self._delta
print(np.where(a > 0,-(sb - sa),nb - na).shape)

# line 162 return np.exp(-x**2/2.0) / _norm_pdf_C
# defining _norm_pdf(x)
norm_pdf_C = np.sqrt(2*np.pi)
print((np.exp(-x**2/2.0) / norm_pdf_C).shape)

我明白

(4100,)
(4100,)

正确且形状相同。所以我不知道问题是什么。如果您有任何建议,我将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。