np.matmul меняет размеры моей матрицы - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть следующие массивы со следующими размерами:

А (2 х 1 х 10). В общем виде (N x 1 x D)

B (30 x 10)

Мне нужно сделать точечное произведение их обоих, используя np.matmul таким образом, что matmul умножает N матриц с формой 1xD из A с другим аргументом B.

Глядя на размеры A и B, следует подумать, что мне нужно сделать транспонирование B перед умножением, чтобы можно было сделать произведение.

B_transpose = np.transpose(B)

Теперь B_transpose равно (10 x 30)

Но когда я это сделаю matmul:

output = np.matmul(A, B_transpose)

выдает ошибку:

ValueError: фигуры (2,1,10) и (2,1,30) не выровнены: 10 (тусклый 2)! = 1 (тусклый 1)

На самом деле, это меняет размеры B_transpose, и я не знаю почему. Это должно быть (10 х 30). Я проверил это с B_transpose.shape, и это все. Но при умножении он конвертирует его в (2 x 1 x 30). Почему это так?

Спасибо.

1 Ответ

0 голосов
/ 03 ноября 2018

Насколько мне известно, вы можете достичь этого с помощью numpy.einsum:

import numpy as np

A = np.random.random((2, 1, 10))
B = np.random.random((30,10))

C=np.einsum('ijk,lk->ijl', A, B)
print(C)

print("shape of A: "+ str(A.shape))
print("shape of B: "+str(B.shape))
print("shape of C: "+str(C.shape))

Выход:

[[[2.24297933 1.90535058 1.64265642 2.017492   1.64335181 1.92980808
   2.49041745 3.34348547 1.99242493 2.48508664 1.46283295 2.32082231
   2.68276213 1.58709381 1.22955766 1.46049189 1.66621528 1.62563277
   2.0199153  2.06292694 1.74791187 2.80959004 1.66948659 1.87064246
   1.4671402  1.83211074 1.70360887 2.13277365 2.0971552  1.89335019]]

 [[3.05604669 3.21934434 1.77297603 2.61009216 2.94784787 3.44622224
   3.13340867 5.00977942 3.55128091 3.75517549 2.71985505 3.84420034
   4.03311806 2.56002937 1.726476   2.53251146 3.43982974 2.2561291
   3.63013679 3.23935523 2.84565586 4.21606203 2.49771182 3.11465742
   2.48485314 3.62590865 2.96567419 3.00654852 3.20750017 3.1852716 ]]]
shape of A: (2, 1, 10)
shape of B: (30, 10)
shape of C: (2, 1, 30)
...