【发布时间】:2018-03-07 01:14:23
【问题描述】:
我想针对分位数的不同值和未截断均值的不同值评估单侧截断正态分布。为了提高效率,我想使用numpy 广播而不是 Python 循环。
对于一个最小可重复的例子,假设我要评估的三个分位数是[3.0, 2.0, 1.0],相应的未截断平均值为[6.0, 5.0, 4.0],下限为1.5,未截断的标准差为@ 987654326@.
单独评估这些可以按预期工作。如果我跑
import numpy as np
from scipy.stats import truncnorm
print truncnorm.logpdf(3.0, a=(1.5-6.0)/3.0, b=np.inf, loc=6.0, scale=3.0)
print truncnorm.logpdf(2.0, a=(1.5-5.0)/3.0, b=np.inf, loc=5.0, scale=3.0)
print truncnorm.logpdf(1.0, a=(1.5-4.0)/3.0, b=np.inf, loc=4.0, scale=3.0)
我明白了
-2.44840736626
-2.3878150686
-inf
(最后一个值是-inf,因为1.0 小于截止值)。一次使用numpy 广播两个值也可以按预期工作。如果我跑
print truncnorm.logpdf(
np.array([3.0, 2.0]),
a=(1.5-np.array([6.0, 5.0]))/3.0,
b=np.inf,
loc=np.array([6.0, 5.0]),
scale=3.0
)
print truncnorm.logpdf(
np.array([2.0, 1.0]),
a=(1.5-np.array([5.0, 4.0]))/3.0,
b=np.inf,
loc=np.array([5.0, 4.0]),
scale=3.0
)
我明白了
[-2.44840737 -2.38781507]
[-2.38781507 -inf]
但是,如果我尝试通过运行一次评估三个值:
print truncnorm.logpdf(
np.array([3.0, 2.0, 1.0]),
a=(1.5-np.array([6.0, 5.0, 4.0]))/3.0,
b=np.inf,
loc=np.array([6.0, 5.0, 4.0]),
scale=3.0
)
我收到一个错误:
Traceback (most recent call last):
File "truncnorm_error.py", line 25, in <module>
scale=3.0
File "C:\Python27\lib\site-packages\scipy\stats\_distn_infrastructure.py", line 1701, in logpdf
place(output, cond, self._logpdf(*goodargs) - log(scale))
File "C:\Python27\lib\site-packages\scipy\stats\_continuous_distns.py", line 4853, in _logpdf
return _norm_logpdf(x) - self._logdelta
ValueError: operands could not be broadcast together with shapes (2,) (3,)
我错过了什么?我正在使用 Python 2.7、numpy 1.13 和 scipy 0.19。
【问题讨论】:
-
看起来像一个错误。您可以在github.com/scipy/scipy/issues 上为此创建一个问题(点击绿色的“新问题”大按钮)。
标签: python python-2.7 numpy scipy array-broadcasting