Python 是否可以将scipy Dirichlet PDF函数矢量化?

Python 是否可以将scipy Dirichlet PDF函数矢量化?,python,numpy,scipy,vectorization,Python,Numpy,Scipy,Vectorization,我知道一些scipy.statspdf函数是开箱即用的矢量化函数,如中所述 我的问题是,我尝试利用Dirichlet的pdf的这种矢量化,希望我可以为同一个alpha参数计算多个x的值数组。可以得到与之相同的结果的东西 将numpy导入为np 将scipy.stats导入为st α=[1,10,1] _xs=np.random.dirichlet的列表(alpha,10**6) values=np.array([st.dirichlet.pdf(x,alpha)表示列表中的x] 老实说,我真的

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

我的问题是,我尝试利用Dirichlet的pdf的这种矢量化,希望我可以为同一个
alpha
参数计算多个
x
的值数组。可以得到与之相同的结果的东西

将numpy导入为np
将scipy.stats导入为st
α=[1,10,1]
_xs=np.random.dirichlet的列表(alpha,10**6)
values=np.array([st.dirichlet.pdf(x,alpha)表示列表中的x]
老实说,我真的不需要对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).
ValueError: Parameter vector 'a' must be one dimensional, but a.shape = ().
这(在我的理解中)表明,函数并不是开箱即用的矢量化,至少在我预期的方式中是这样

  • 使用
    f=np.vectorize(st.dirichlet.pdf)
    对函数进行向量化,然后使用堆叠的alpha
    f(x,alpha)
这不起作用,因为Scipy抛出以下错误:

ValueError: Parameter vector 'a' must be one dimensional, but a.shape = (1000000, 3).
ValueError: Parameter vector 'a' must be one dimensional, but a.shape = ().
我认为这是因为我误用了
np.vectorize()
函数,或者pdf函数不能以这种方式进行矢量化


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

只需转置第一个参数,就可以得到想要的确切结果:

st.dirichlet.pdf(list_of_xs.T, alpha)
文档提示这可能是可能的,但链接非常混乱,因此从未明确说明:

请注意,dirichlet接口有些不一致。rvs函数返回的数组将根据
pdf
logpdf
所期望的格式进行转换


另一方面,我已经向scipy提交了一份相关说明,以查看文档上的链接是否可以修复。

为什么不传入一个字母shape
(N*3,)
,并将其重塑为
(N,3)
@madpysicator,我不太明白。。。传递形状
(N*3,)
alpha
会抛出错误
向量“x”的条目数必须与参数向量“a”的条目数相同,或者比参数向量“a”的条目数少一条
,并将其整形为
(N,3)
与将它们与
np.vstack()
叠加在一起是一样的,不是吗?另外,对于Dirichlet pdf,保持
alpha
的维度不是很重要吗?