Python 为什么numpy.random.dirichlet()不接受多维数组?

Python 为什么numpy.random.dirichlet()不接受多维数组?,python,numpy,Python,Numpy,在这方面,他们举了一个例子 s = np.random.dirichlet((10, 5, 3), 20) 这一切都是美好而伟大的;但是,如果您想从二维alpha数组生成随机样本,该怎么办 alphas = np.random.randint(10, size=(20, 3)) 如果您尝试np.random.dirichlet(alphas),np.random.dirichlet([x代表x在alphas中]),或np.random.dirichlet([x代表x在alphas中]),则会

在这方面,他们举了一个例子

s = np.random.dirichlet((10, 5, 3), 20)
这一切都是美好而伟大的;但是,如果您想从二维alpha数组生成随机样本,该怎么办

alphas = np.random.randint(10, size=(20, 3))
如果您尝试
np.random.dirichlet(alphas)

np.random.dirichlet([x代表x在alphas中])
,或
np.random.dirichlet([x代表x在alphas中])
,则会导致
ValueError:对象对于所需数组太深
。唯一有效的办法是:

y = np.empty(alphas.shape)
for i in xrange(np.alen(alphas)):
    y[i] = np.random.dirichlet(alphas[i])
    print y
…对于我的代码结构来说,这远远不是理想的。为什么会是这种情况,有人能想出一种更像“裸体”的方式吗


提前谢谢。

我想你在找

y = np.array([np.random.dirichlet(x) for x in alphas])

为了你对清单的理解。否则,您只需传递一个python列表或元组。我想
numpy.random.dirichlet
不接受您的alpha值列表的原因是因为它没有设置为-它已经接受一个数组,根据文档,它希望数组的维度为
k

np.random.dirichlet
用于为单个dirichlet分布生成样本。该代码根据Gamma分布实现,并且该实现可以用作矢量化代码的基础,以从不同分布生成样本。在下面的示例中,
dirichlet_sample
采用一个具有形状(n,k)的数组
alphas
,其中每一行都是dirichlet分布的
alpha
向量。它还返回一个具有形状(n,k)的数组,每一行都是
alphas
中相应分布的样本。当作为脚本运行时,它使用
dirichlet_sample
np.random.dirichlet
生成样本,以验证它们是否生成相同的样本(最大为正常浮点差)

样本运行:

dirichlet_sample:
[[ 0.38980834  0.4043844   0.20580726]
 [ 0.14076375  0.26906604  0.59017021]
 [ 0.64223074  0.26099934  0.09676991]
 [ 0.21880145  0.33775249  0.44344606]
 [ 0.39879859  0.40984454  0.19135688]
 [ 0.73976425  0.21467288  0.04556287]]
np.random.dirichlet:
[[ 0.38980834  0.4043844   0.20580726]
 [ 0.14076375  0.26906604  0.59017021]
 [ 0.64223074  0.26099934  0.09676991]
 [ 0.21880145  0.33775249  0.44344606]
 [ 0.39879859  0.40984454  0.19135688]
 [ 0.73976425  0.21467288  0.04556287]]
max difference: 5.55111512313e-17

这看起来更好,但不比OP的方法快。谢谢,@BhajunSingh。有没有一种方法可以使用
np.fromiter
来实现这一点,以最小化python
for
循环的开销?事实上,循环理解比OP的循环慢。。。不知道为什么。谢谢,@WarrenWeckesser。我试试看。
dirichlet_sample:
[[ 0.38980834  0.4043844   0.20580726]
 [ 0.14076375  0.26906604  0.59017021]
 [ 0.64223074  0.26099934  0.09676991]
 [ 0.21880145  0.33775249  0.44344606]
 [ 0.39879859  0.40984454  0.19135688]
 [ 0.73976425  0.21467288  0.04556287]]
np.random.dirichlet:
[[ 0.38980834  0.4043844   0.20580726]
 [ 0.14076375  0.26906604  0.59017021]
 [ 0.64223074  0.26099934  0.09676991]
 [ 0.21880145  0.33775249  0.44344606]
 [ 0.39879859  0.40984454  0.19135688]
 [ 0.73976425  0.21467288  0.04556287]]
max difference: 5.55111512313e-17