Итерация массива Numpy для конфликта форм генератора random.normal - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь сгенерировать n (в данном случае n = 57) случайных чисел из нормального распределения для числа выборочных средних и стандартных отклонений от модели PyMc3 (в данном случае 350). Поэтому я хочу в конечном итоге получить 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

Цените любое наставление, которое вы можете предоставить.

1 Ответ

0 голосов
/ 01 марта 2020

Ваш nditer l oop ничего не делает для вас. Вы даже не используете переменные 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

Если размер соответствует размеру первых двух аргументов, хорошо:

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