Как работает команда numpy.tensordot и в чем смысл суммирования по оси в этой команде? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь понять, как работает команда numpy.tensordot.Я просматриваю разные вопросы на этом форуме, связанные с этой командой.Более того, axes (1,0) указывает, что axes 1 in a и axes 0 in b будут суммироваться.Поэтому я суммирую члены по осям 1 в и по нулевой оси в b и вычисляю ответ вручную, но результат будет другим.Может быть, мое понимание суммирования по определенной оси неверно.Может кто-нибудь объяснить, как мы получаем окончательный результат в следующем коде?

a = numpy.array([[1,2],[3,4]])
b = numpy.array([[0,5],[-1,20]])

c = numpy.tensordot(a,b,axes=(1,0))

print(c)
print("result")
[[-2 45]
[-4 95]]

1 Ответ

0 голосов
/ 24 февраля 2019
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 и т. Д.), Что немного сложнее.Я исследовал это в другом посте.

...