Кажется, что Numpy ведет себя не слишком интуитивно с широковещательными массивами. Допустим, у нас есть два массива
a = numpy.ones((2,2,3))
b = numpy.array([[1],[2]])
Я бы ожидал, что смогу умножить их вместе с выводом
>>> a*b
array([[[1., 1., 1.],
[1., 1., 1.]],
[[2., 2., 2.],
[2., 2., 2.]]])
Однако вместо этого мы получаем
>>> a*b
array([[[1., 1., 1.],
[2., 2., 2.]],
[[1., 1., 1.],
[2., 2., 2.]]])
Фактически, это умножение работает только потому, что секунда размерность a
совпадает с external размерностью b
(2, в данном случае). Если вместо этого у нас есть a = numpy.ones((2,3,3))
, я получаю следующую ошибку:
>>> a*b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3,3) (2,1)
Причина, по которой я нахожу это странным, заключается в том, что трансляция вместе массивов с формами (3,4) и (1,) будет работать нормально - так почему это не работает, когда они являются «подмассивами» двух больших массивов?
И какой самый «питонный» способ сделать то, что я хочу? В частности, это для создания трехмерного массива, в котором каждый из двухмерных подмассивов имеет различное значение, повторяемое на всем протяжении. Очевидно, я мог бы просто использовать цикл, но он не выглядит элегантным.