Если я 2 массивов с формами вы описываете, я получаю сообщение об ошибке
In [1856]: norm_array=np.ones((20,30))
In [1857]: reference=np.ones((20,0))
In [1858]: norm_array-reference
...
ValueError: operands could not be broadcast together with shapes (20,30) (20,0)
Но это отличается от вашего. Но если я изменяю форму reference
, сообщения об ошибках совпадают.
In [1859]: reference=np.ones((20,))
In [1860]: norm_array-reference
...
ValueError: operands could not be broadcast together with shapes (20,30) (20,)
Так что ваш (20,0)
неправ. Я не знаю, что вы что-то угадали или нет.
Но если я reference
2d с 1 в последнем измерении, передающую работы, производя различие, которое соответствует (20,30) в форме:
In [1861]: reference=np.ones((20,1))
In [1862]: norm_array-reference
If reference = np.zeros((20,))
, то я мог бы использовать, чтобы добавить reference[:,None]
это одномерное измерение.
Если reference
есть (20,), вы не можете сделать reference[0][0]
. reference[0][0]
работает только с 2d массивами, по крайней мере, с 1 в последнем тусклом. reference[0,0]
- предпочтительный способ индексирования одного элемента массива 2d.
До сих пор это нормальные размеры и широковещание массива; то, чему вы научитесь с пользой.
===============
Я озадачен о форме out
. Если это (20,), то как norm_array
заканчивается как (20,30). out
должен состоять из 20 массивов или списков, каждый из которых имеет 30 элементов.
Если out
был 2d массив, можно нормализовать без итерации
In [1869]: out=np.arange(12).reshape(3,4)
со списком понимания:
In [1872]: [out[i]/np.sum(out[i]) for i in range(out.shape[0])]
Out[1872]:
[array([ 0. , 0.16666667, 0.33333333, 0.5 ]),
array([ 0.18181818, 0.22727273, 0.27272727, 0.31818182]),
array([ 0.21052632, 0.23684211, 0.26315789, 0.28947368])]
In [1873]: np.array(_) # and to array
Out[1873]:
array([[ 0. , 0.16666667, 0.33333333, 0.5 ],
[ 0.18181818, 0.22727273, 0.27272727, 0.31818182],
[ 0.21052632, 0.23684211, 0.26315789, 0.28947368]])
Вместо взять строки суммы, и сказать ему, чтобы держать его 2d для облегчения дальнейшего использование
In [1876]: out.sum(axis=1,keepdims=True)
Out[1876]:
array([[ 6],
[22],
[38]])
сейчас разделите
In [1877]: out/out.sum(axis=1,keepdims=True)
Out[1877]:
array([[ 0. , 0.16666667, 0.33333333, 0.5 ],
[ 0.18181818, 0.22727273, 0.27272727, 0.31818182],
[ 0.21052632, 0.23684211, 0.26315789, 0.28947368]])
Добавление к этому: вы должны прочитать о правилах вещания. Если последнее измерение из 2 массивов отличается, один из них должен быть «1», чтобы иметь возможность транслировать. В вашем случае ваши последние измерения - '0' и' 30', поэтому трансляция невозможна, поэтому сообщение об ошибке. Вы, вероятно, хотите 'reference.shape = (20,1)' ... – Julien
, не говоря уже о том, что понимание списка просто выводит '1' (и nans). –