Python 迭代Numpy数组以获取random.normal生成器形状冲突
我试图从PyMc3模型(在本例中为350)的若干抽样平均值和标准偏差的正态分布中生成n个(在本例中为n=57)随机数。因此,我最终希望得到350个分布,每个分布57个长度。我确信这是一件直截了当的事情,我缺乏概念上的理解。输入为:Python 迭代Numpy数组以获取random.normal生成器形状冲突,python,numpy,pymc3,Python,Numpy,Pymc3,我试图从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.a
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
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
np.nditer([prpc5μ,prpc5σ])中x,y的值为1:
---->2 y_prpc5=np.随机.正常(prpc5[:,0],prpc5[:,1],大小=n)
numpy.random.mtrand.RandomState.normal()中的mtrand.pyx
_numpy.random中的common.pyx.\u common.cont()
_numpy.random.中的common.pyx.\u common.cont\u broadcast\u 2()
__numpy.PyArray\u MultiIterNew3()中的init_uuuuuuuuuuuuuuuuuuuuuux.pxd
ValueError:形状不匹配:无法将对象广播到单个形状
感谢你能提供的任何教化 您的
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
为什么要使用
nditer
?互联网站鼓励nditer遍历数组。prpc5在完整的代码中定义,但为了简洁起见,我省略了它。在任何情况下,当我将prpc5 dict转换为单个阵列时,我有两个长度为350的1D阵列。为了澄清,我想从正态分布生成350个样本,每个样本长度为57。我将如何使用np.random.normal进行此操作?
In [65]: np.random.normal([1,2],[1,1],size=2)
Out[65]: array([1.91404732, 2.79305575])