In [60]: A = np.array([[[10, -1],
...: [-1, 10]],
...: [[30, 4],
...: [5, 10]]])
...: B = np.array([[[5],[2]],
...: [[3],[4]]])
In [61]: A
Out[61]:
array([[[10, -1],
[-1, 10]],
[[30, 4],
[ 5, 10]]])
In [62]: A.shape
Out[62]: (2, 2, 2)
In [63]: B.shape
Out[63]: (2, 2, 1)
matmul
, @
предназначен для выполнения dot
для «партий» следующим образом:
In [64]: A@B
Out[64]:
array([[[ 48],
[ 15]],
[[106],
[ 55]]])
einsum
также работает
In [65]: np.einsum('mij,mjl->mil',A,B)
Out[65]:
array([[[ 48],
[ 15]],
[[106],
[ 55]]])
np.dot
выполняет внешнее произведение по измерениям, которые не суммируются:
In [66]: np.dot(A,B).shape
Out[66]: (2, 2, 2, 1)
Ваш желаемый результат может быть извлечен из диагонали, но это медленнее, поскольку он фактически отбрасывает половинурезультаты:
In [68]: np.dot(A,B)[range(2),:,range(2),:]
Out[68]:
array([[[ 48],
[ 15]],
[[106],
[ 55]]])