首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有来自scipy.stats的‘`norm`’方法的cythonized版本?

有没有来自scipy.stats的‘`norm`’方法的cythonized版本?
EN

Stack Overflow用户
提问于 2015-09-03 03:24:05
回答 1查看 223关注 0票数 2

我说的是scipy.stats中连续RV的主要公共方法:

具体来说,from scipy.stats import norm然后使用

norm.ppfnorm.pdf

链接:http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html

有没有机会通过使用cython来优化norm.ppf()或norm.pdf()的速度?或者它已经优化了,或者不值得用cython来包装?

EN

回答 1

Stack Overflow用户

发布于 2015-09-03 06:06:34

中的代码检查过吗

.../scipy/stats/distributions.py?

看起来norm_pdf最终使用了

代码语言:javascript
复制
_norm_pdf_C = math.sqrt(2*pi)
_norm_pdf_logC = math.log(_norm_pdf_C)

def _norm_pdf(x):
    return exp(-x**2/2.0) / _norm_pdf_C

因为它不涉及通过numpy数组的循环,所以它看起来不像是cython加速的主要候选者。你会用不同的方式写吗?

哦,对不起。您正在询问的函数如下:

代码语言:javascript
复制
def pdf(self,x,*args,**kwds):
    args, loc, scale = self._parse_args(*args, **kwds)
    x,loc,scale = map(asarray,(x,loc,scale))
    args = tuple(map(asarray,args))
    x = asarray((x-loc)*1.0/scale)
    cond0 = self._argcheck(*args) & (scale > 0)
    cond1 = (scale > 0) & (x >= self.a) & (x <= self.b)
    cond = cond0 & cond1
    output = zeros(shape(cond),'d')
    putmask(output,(1-cond0)+np.isnan(x),self.badvalue)
    if any(cond):
        goodargs = argsreduce(cond, *((x,)+args+(scale,)))
        scale, goodargs = goodargs[-1], goodargs[:-1]
        place(output,cond,self._pdf(*goodargs) / scale)
    if output.ndim == 0:
        return output[()]
    return output

除了使用map进行参数检查和消息传递之外,我还发现在putmaskplace中隐藏了一些迭代。我不经常使用place,但我认为它是在cond上迭代,应用self._pdf,并将值放在output中。我怀疑代码组织的目的是提供很大的灵活性,允许不同的模型和发行版。我没有看到以速度为目标的紧凑代码。

对于从转换到cython中受益的代码,您可能需要从头开始编写一些代码,这些代码不会调用大量其他numpyscipy代码,也不会构建复杂的类结构。专注于一个非常具体的计算,而不是一系列的计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32361491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档