numpy.tensordot命令如何工作?此命令中的轴求和是什么意思?

时间:2019-02-24 04:47:31

标签: python numpy numpy-ndarray

我试图了解numpy.tensordot命令的工作方式。我会在论坛上发布与此命令相关的其他问题。此外,axes (1,0)表示将axes 1 in aaxes 0 in b相加。因此,我沿a的轴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 :(得分:1)

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)表示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的简单调用。然后根据需要重塑/转置。详细信息取决于axes参数。在您的情况下,无需重塑,因为您的规范与默认的dot动作匹配。

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