Python numpy.tensordot命令是如何工作的?在这个命令中对轴求和的含义是什么?

Python numpy.tensordot命令是如何工作的?在这个命令中对轴求和的含义是什么?,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,我试图理解numpy.tensordot命令是如何工作的。我浏览了论坛上发布的与此命令相关的不同问题。此外,轴(1,0)表示a中的轴1和b中的轴0将相加。所以我沿着a轴1和b轴0求和,然后手动计算答案,但结果不同。可能是我对沿特定轴求和的理解是错误的。有人能解释一下我们是如何在下面的代码中得到最终结果的吗 a = numpy.array([[1,2],[3,4]]) b = numpy.array([[0,5],[-1,20]]) c = numpy.tensordot(a,b,axes=(1

我试图理解
numpy.tensordot
命令是如何工作的。我浏览了论坛上发布的与此命令相关的不同问题。此外,
轴(1,0)
表示a中的
轴1和b中的
轴0将相加。所以我沿着a轴1和b轴0求和,然后手动计算答案,但结果不同。可能是我对沿特定轴求和的理解是错误的。有人能解释一下我们是如何在下面的代码中得到最终结果的吗

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)表示
a
的轴1和
b
的轴0是乘积轴的总和。这只是正常的
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
的简单调用。然后根据需要重新塑造/转换回原形。详细信息取决于
参数。在您的情况下,不需要重塑,因为您的规范与默认的
dot
操作相匹配


元组轴参数相对容易解释。还有一个标量轴的情况(0,1,2等),这有点棘手。我在另一篇文章中对此进行了探讨。

谢谢。你能解释一下三阶张量的情况吗?轴0和轴1很容易处理,但是轴2呢?轴2呢?你必须树立一个更清晰的榜样。
In [440]: (a[:,:,None]*b[None,:,:]).sum(axis=1)                                 
Out[440]: 
array([[-2, 45],
       [-4, 95]])