首页 > 解决方案 > 为 random.normal 生成器形状冲突迭代 Numpy 数组

问题描述

我正在尝试从 PyMc3 模型(在本例中为 350)的多个采样均值和标准偏差的正态分布中生成 n 个(在本例中为 n=57)随机数。所以我最终希望得到 350 个长度为 57 的分布。我确信这是直截了当的事情,我缺乏概念上的理解。输入是:

 prior_pc5 =pm.sample_prior_predictive(samples=350,model=model_5,
    var_names='μ','σ'],random_seed=21)

    n=57

    prpc5_μ = np.asarray(prior_pc5['μ'])
    prpc5_σ = np.asarray(prior_pc5['σ'])

for x,y in np.nditer([prpc5_μ,prpc5_σ]):
    y_prpc5 = np.random.normal(prpc5[:,0],prpc5[:,1], size=n)

输出是:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-180-90195f458d14> in <module>
      1 for x,y in np.nditer([prpc5_μ,prpc5_σ]):
----> 2     y_prpc5 = np.random.normal(prpc5[:,0],prpc5[:,1], size=n)

mtrand.pyx in numpy.random.mtrand.RandomState.normal()

_common.pyx in numpy.random._common.cont()

_common.pyx in numpy.random._common.cont_broadcast_2()

__init__.pxd in numpy.PyArray_MultiIterNew3()

ValueError: shape mismatch: objects cannot be broadcast to a single shape

欣赏你能提供的任何启迪。

标签: pythonnumpypymc3

解决方案


你的nditer循环对你没有任何作用。你甚至不使用x,y变量。prpc5变量未定义。并且没有尝试积累y_prpc5价值。

如果您需要迭代某些东西,请从简单的迭代开始。不要尝试使用nditer(除非您可以阅读并理解其所有文档)。它并没有更快,也更难正确使用。

但错误与nditer.

np.random.normal(prpc5[:,0],prpc5[:,1], size=n)

不使用任何迭代变量。

带有标量参数的大小:

In [63]: np.random.normal(1,2,size=57)                                                         
Out[63]: 
array([-0.15095176,  0.68354153,  0.64270214,  1.71539129,  3.82930345,
       -0.93888021,  0.34013012,  4.7390541 ,  1.95647694, -0.02787572,
        0.53790931,  3.64859278, -2.66455301, -1.81567149,  2.62141742,
       -0.22887411, -0.36284743,  2.92298403,  1.87943503,  2.12060767,
       -1.10172555,  0.04234386,  0.48707306,  5.66358341,  0.70659526,
       -0.74210809, -2.04678512, -0.16496427, -0.46041457,  0.50505178,
        1.66497518,  2.20486689,  1.83034991, -1.73740446, -3.117619  ,
        1.12649528,  2.58059286,  1.42897399,  2.37256695, -2.34670202,
        3.00318398,  2.78164509, -1.1329154 ,  4.06859674,  3.13266299,
       -0.35481326,  1.79429889,  1.71617491,  1.41543611,  0.9476942 ,
       -0.79856396, -0.83121952, -2.63145461,  0.13941223,  0.18895024,
        3.21956521, -2.75348353])

具有大小的数组/列表参数:

In [64]: np.random.normal([1,2],[1,1],size=57)                                                 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-64-9a493d59b8d2> in <module>
----> 1 np.random.normal([1,2],[1,1],size=57)

mtrand.pyx in numpy.random.mtrand.RandomState.normal()

_common.pyx in numpy.random._common.cont()

_common.pyx in numpy.random._common.cont_broadcast_2()

__init__.pxd in numpy.PyArray_MultiIterNew3()

ValueError: shape mismatch: objects cannot be broadcast to a single shape

如果 size 与前两个参数的大小匹配,则可以:

In [65]: np.random.normal([1,2],[1,1],size=2)                                                  
Out[65]: array([1.91404732, 2.79305575])

推荐阅读