numpy.tensordot 命令如何工作?在此命令中对轴求和的含义是什么?
How numpy.tensordot command works?and what is the meaning of summing over axis in this command?
我正在尝试了解 numpy.tensordot
命令的工作原理。我浏览了此论坛上发布的与此命令相关的不同问题。另外axes (1,0)
表示axes 1 in a
和axes 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]]
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
的简单调用。然后 reshapes/transposes 根据需要返回。详细信息取决于 axes
参数。在您的情况下,不需要重塑,因为您的规范符合默认的 dot
操作。
元组轴参数比较容易解释。还有一个标量轴情况(0、1、2 等),这有点棘手。我在另一个 post.
中对此进行了探讨
我正在尝试了解 numpy.tensordot
命令的工作原理。我浏览了此论坛上发布的与此命令相关的不同问题。另外axes (1,0)
表示axes 1 in a
和axes 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]]
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
的简单调用。然后 reshapes/transposes 根据需要返回。详细信息取决于 axes
参数。在您的情况下,不需要重塑,因为您的规范符合默认的 dot
操作。
元组轴参数比较容易解释。还有一个标量轴情况(0、1、2 等),这有点棘手。我在另一个 post.
中对此进行了探讨