Как сделать dot.product из 2D и 3D матриц (взяв его для каждого измерения отдельно) - PullRequest
1 голос
/ 26 июня 2019

Мне нужно рассчитать скалярное произведение двух матриц.Вероятно, тензордот сделает эту работу, но я изо всех сил пытаюсь найти точное решение.

Простой вариант

res = np.dot(x, fullkernel[:, :-1].transpose())

отлично работает, где x имеет форму (9999,), полное ядро ​​формы (980, 10000) и res имеет форму (1, 980).

Теперь мне нужно сделать аналогичную вещь с двумя измерениями.Таким образом, мой x теперь имеет форму (9999, 2), fullkernel (2, 980, 10000).

Буквально я хочу, чтобы мой результат "res" имел два измерения, где каждое из них представляет собой dot.product одного столбца x и одного измерения fullkernel.

1 Ответ

0 голосов
/ 26 июня 2019

Вы можете сделать это следующим образом:

res = np.einsum('ki,ijk->ij', x, fullkernel[:, :, :-1])
print(res.shape)
# (2, 980)

Если вы хотите иметь дополнительное одноэлементное измерение в середине, просто выполните:

res = np.expand_dims(res, 1)

Эквивалентное решение с @/ np.matmul будет:

res = np.expand_dims(x.T, 1) @ np.moveaxis(fullkernel[:, :, :-1], 2, 1)
print(res.shape)
# (2, 1, 980)
...