python - трансляция между массивами с одинаковым «внешним» размером - PullRequest
0 голосов
/ 04 сентября 2018

Кажется, что 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,) будет работать нормально - так почему это не работает, когда они являются «подмассивами» двух больших массивов?

И какой самый «питонный» способ сделать то, что я хочу? В частности, это для создания трехмерного массива, в котором каждый из двухмерных подмассивов имеет различное значение, повторяемое на всем протяжении. Очевидно, я мог бы просто использовать цикл, но он не выглядит элегантным.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

У вас есть (2,2,3) и (2,1). 2-й расширен до (1,2,1) (автоматически новая ось спереди), а затем до (2,2,3).

Попробуйте b[:,:,None] сделать это (2,1,1).

0 голосов
/ 04 сентября 2018

Как насчет?

a = np.ones((2,2,3))
b = np.array([[[1],
              [1]],
               [[2],
              [2]]])

print(a*b)


array([[[1., 1., 1.],
        [1., 1., 1.]],

       [[2., 2., 2.],
        [2., 2., 2.]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...