【发布时间】: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