In [432]: a=np.array([[1,2],[3,4]]); b=np.array([[0,5],[-1,20]])
In [433]: np.tensordot(a,b,axes=(1,0))
Out[433]:
array([[-2, 45],
[-4, 95]])
(1,0) означает, что ось 1 из a
и ось 0 из b
являются осями суммы продуктов.Это просто нормальное np.dot
соединение:
In [434]: np.dot(a,b)
Out[434]:
array([[-2, 45],
[-4, 95]])
Я считаю, что запись einsum
будет более понятной:
In [435]: np.einsum('ij,jk->ik',a,b)
Out[435]:
array([[-2, 45],
[-4, 95]])
В любом случае это матричный продукт, который мы изучили в школе -проведите пальцем по строкам a
и по столбцам b
.
[[1*0+2*-1, 1*5+2*20], ...]
Еще одно выражение - расширяющееся от einsum
:
In [440]: (a[:,:,None]*b[None,:,:]).sum(axis=1)
Out[440]:
array([[-2, 45],
[-4, 95]])
tensordot
изменяет форму и транспонирует оси, чтобы свести проблему к простому вызову np.dot
.Затем он переформирует / переносит обратно по мере необходимости.Детали зависят от параметров axes
.В вашем случае изменение формы не требуется, поскольку ваша спецификация соответствует действию dot
по умолчанию.
Параметр осей кортежей относительно легко объяснить.Существует также случай скалярной оси (0,1,2 и т. Д.), Что немного сложнее.Я исследовал это в другом посте.