【问题标题】:Is it possible to vectorize the scipy Dirichlet PDF function?是否可以矢量化 scipy Dirichlet PDF 函数?
【发布时间】:2021-06-06 15:52:11
【问题描述】:

我知道一些scipy.stats pdf 函数是开箱即用的矢量化,如manual 中所述。

我的问题是我已经尝试将这种向量化与 Dirichlet 的 pdf scipy.stats.dirchlet.pdf(x, alpha) 一起使用,因为我可以为同一个 alpha 参数计算多个 x 的值数组。可以得到相同结果的东西

import numpy as np
import scipy.stats as st

alpha = [1,10,1]
list_of_xs = np.random.dirichlet(alpha,10**6)

values = np.array([st.dirichlet.pdf(x, alpha) for x in list_of_xs)])

老实说,我并不真的需要对 pdf 函数进行矢量化,但使用 for 循环执行此操作需要很长时间,以至于我希望矢量化可以加速代码。

我尝试过的事情

  • 传递 alpha 作为形状数组 (10**6, 3)np.vstack([alpha] * 10**6) 堆叠

这不起作用,因为 Scipy 抛出以下错误:

ValueError: Parameter vector 'a' must be one dimensional, but a.shape = (1000000, 3).

这(在我的理解中)表明该函数不是开箱即用的矢量化,至少以我预期的方式。

  • f = np.vectorize(st.dirichlet.pdf)对函数进行向量化,然后用堆叠的alphaf(x, alpha)调用新函数f

这不起作用,因为 Scipy 抛出以下错误:

ValueError: Parameter vector 'a' must be one dimensional, but a.shape = ().

我认为发生这种情况要么是因为我滥用了 np.vectorize() 函数,要么是 pdf 函数无法以这种方式矢量化。

那么,如果可以对这个函数进行矢量化,我该怎么做呢?为它的工作值得吗?我的意思是,在我的简单理解中,矢量化几乎总是有助于加快这种代码的速度,但我不确定这里是否是这种情况。

【问题讨论】:

  • 为什么不传入一个形状为(N * 3,) 的alpha 并重塑为(N, 3)
  • @MadPhysicist 我不太明白...传递形状为(N * 3,)alpha 会引发错误Vector 'x' must have either the same number of entries as, or one entry fewer than, parameter vector 'a' 并将其重新整形为(N, 3) 与将它们与@ 堆叠相同987654343@,不是吗?此外,对于 Dirichlet pdf,保持 alpha 的维度不重要吗?

标签: python numpy scipy vectorization


【解决方案1】:

您可以通过简单地转置第一个参数来获得您想要的确切结果:

st.dirichlet.pdf(list_of_xs.T, alpha)

dirichlet 的文档暗示这可能是可能的,但链接一团糟,因此从未明确说明:

请注意,dirichlet 接口有些不一致。 rvs 函数返回的数组相对于pdflogpdf 预期的格式进行了转置。

在相关说明中,我已将 PR #14190 提交给 scipy 以查看是否可以修复文档上的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2019-06-16
    相关资源
    最近更新 更多