Как указать внешнее произведение определенной оси в python? - PullRequest
2 голосов
/ 19 февраля 2020

Могу ли я спросить, как рассчитать внешнее произведение для определенных осей 2 матриц в numpy? Например:

A = np.arange(24).reshape(3,4,2,1)
B = np.arange(24).reshape(3,4,1,2)

И я sh получу матрицу C:

C = some_function(A,B)

такую, что

C.shape: (3,4,2,2)

, что означает, что я просто сделайте внешний продукт для последних 2 осей.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Ваши массивы уже имеют правильную форму, так что широковещательная сделает для вас внешний продукт:

import numpy as np

A = np.arange(24).reshape(3,4,2,1)
B = np.arange(24).reshape(3,4,1,2)

C = A * B
C.shape # (3, 4, 2, 2)

Если вы хотите выполнить этот продукт для массивов без лишних осей, вы Вы можете добавить оси на лету:

A = np.arange(24).reshape(3,4,2)  # note the absence of 1
B = np.arange(24).reshape(3,4,2)

C = A[..., :, None] * B[..., None, :]  # extra axes are added here
C.shape # (3, 4, 2, 2)

И просто переместить инструкцию :, None / None, : в правильное положение, если хотите создать другую ось:

C = A[:, None, ...] * B[None, :, ...]
C.shape # (3, 3, 4, 2)
2 голосов
/ 19 февраля 2020

делает

C = np.einsum('...ij,...ik->...ik',A,B)

добиваться цели? C is

  [[[[  0,   0],
     [  0,   1]],

    [[  4,   6],
     [  6,   9]],

    [[ 16,  20],
     [ 20,  25]],

    [[ 36,  42],
     [ 42,  49]]],


   [[[ 64,  72],
     [ 72,  81]],

    [[100, 110],
     [110, 121]],

    [[144, 156],
     [156, 169]],

    [[196, 210],
     [210, 225]]],


   [[[256, 272],
     [272, 289]],

    [[324, 342],
     [342, 361]],

    [[400, 420],
     [420, 441]],

    [[484, 506],
     [506, 529]]]])

Это хороший пост в блоге для понимания einsum: http://ajcr.net/Basic-guide-to-einsum/

PS в вашем вопросе вы уже добавили дополнительные измерения в A и B, которые дают *, дают внешний продукт (в 2D-версии). Однако einsum может дать внешний продукт без дополнительного измерения:

A = np.arange(24).reshape(3,4,2)
B = np.arange(24).reshape(3,4,2)
C = np.einsum('...i,...j->...ij', A, B)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...