numpy 中向量的 Tensordot
Tensordot for vectors in numpy
我目前正在尝试使用 numpy 为向量创建张量点。例如,假设我有以下变量:
a = [np.array([1, 2]), np.array([3,4])]
b = [np.array([5,6]), np.array([7,8])]
我想计算 "tensor product of the vectors",即 [a[0]*b[0], a[0]*b[1], a[1]*b[0], a [1]*b[1]] 在我们的例子中会给出:
a x b = [[5,12], [7,16], [15, 24], [21, 32]]
我尝试过沿不同轴使用tensordot的许多组合,但它从来没有给我想要的结果:((
例如,我尝试了以下方法:
np.tensordot(a,b)
这给了我 array(70)
或np.tensordot(a,b, axes = 0)
这给了我
array([[[[ 5, 6],
[ 7, 8]],
[[10, 12],
[14, 16]]],
[[[15, 18],
[21, 24]],
[[20, 24],
[28, 32]]]])
我也尝试过使用不同的轴,例如 np.tensordot(a,b, axes = ([0], [1]))
但没有成功...
有人可以帮助我吗? :)
我敢肯定这很微不足道,但我似乎错过了一些东西
谢谢。
In [663]: a = np.array([[1, 2], [3,4]]); b = np.array([[5,6], [7,8]])
这两个数组的简单点(矩阵乘积):
In [664]: a.dot(b)
Out[664]:
array([[19, 22],
[43, 50]])
你想要的数组:
In [665]: [a[0]*b[0], a[0]*b[1], a[1]*b[0], a[1]*b[1]]
Out[665]: [array([ 5, 12]), array([ 7, 16]), array([15, 24]), array([21, 32])]
In [666]: np.array(_)
Out[666]:
array([[ 5, 12],
[ 7, 16],
[15, 24],
[21, 32]])
np.tensordot
是对np.dot
进行概括的尝试;对于像这样的二维数组,它不能做一些添加的转置不能做的事情。
从这个意义上说,您的结果不是 tensordot
。 dot
涉及sum of products
;你没有做任何总结。相反,它看起来更像是一个外部产品,或者可能是 kron
.
的变体
经过几次试验,我用 einsum
:
复制了你的数组
In [673]: np.einsum('ij,kj->ikj',a,b)
Out[673]:
array([[[ 5, 12],
[ 7, 16]],
[[15, 24],
[21, 32]]])
In [674]: _.reshape(-1,2)
Out[674]:
array([[ 5, 12],
[ 7, 16],
[15, 24],
[21, 32]])
einsum
与 dot
和 tensordot
一样是围绕乘积求和构建的,但让我们可以更好地控制哪些轴相乘,哪些轴相加。在这里,我们不求和。
我可以获得相同的 3d 数组:
In [675]: a[:,None,:]*b[None,:,:]
Out[675]:
array([[[ 5, 12],
[ 7, 16]],
[[15, 24],
[21, 32]]])
tensordot
根据文档,轴的默认值为 2:
In [714]: np.tensordot(a,b)
Out[714]: array(70)
In [715]: np.tensordot(a,b,axes=2)
Out[715]: array(70)
axes = 2
: (default) tensor double contraction :math:a:b
换句话说,将数组相乘,然后对所有轴求和。在我看来,使用 einsum
表示法更清楚:
In [719]: np.einsum('ij,ij',a,b)
Out[719]: 70
In [718]: np.tensordot(a,b,axes=0).shape
Out[718]: (2, 2, 2, 2)
axes = 0
: tensor product :math:a\otimes b
: tensor product a\otimes b
np.einsum('ij,kl',a,b)
我可以看到你想要的结果,或者至少你的 (2,2,2,2) 数组中的 Out[673]
版本,作为某种对角线子集。
我不太使用这些标量,例如 tensordot
的 axes
模式。在之前的 post 一两年里,我对它们感到困惑,但我感觉不太好。如果 einsum
.
我更喜欢清晰度
我目前正在尝试使用 numpy 为向量创建张量点。例如,假设我有以下变量:
a = [np.array([1, 2]), np.array([3,4])]
b = [np.array([5,6]), np.array([7,8])]
我想计算 "tensor product of the vectors",即 [a[0]*b[0], a[0]*b[1], a[1]*b[0], a [1]*b[1]] 在我们的例子中会给出:
a x b = [[5,12], [7,16], [15, 24], [21, 32]]
我尝试过沿不同轴使用tensordot的许多组合,但它从来没有给我想要的结果:((
例如,我尝试了以下方法:
np.tensordot(a,b)
这给了我 array(70)
或np.tensordot(a,b, axes = 0)
这给了我
array([[[[ 5, 6],
[ 7, 8]],
[[10, 12],
[14, 16]]],
[[[15, 18],
[21, 24]],
[[20, 24],
[28, 32]]]])
我也尝试过使用不同的轴,例如 np.tensordot(a,b, axes = ([0], [1]))
但没有成功...
有人可以帮助我吗? :) 我敢肯定这很微不足道,但我似乎错过了一些东西
谢谢。
In [663]: a = np.array([[1, 2], [3,4]]); b = np.array([[5,6], [7,8]])
这两个数组的简单点(矩阵乘积):
In [664]: a.dot(b)
Out[664]:
array([[19, 22],
[43, 50]])
你想要的数组:
In [665]: [a[0]*b[0], a[0]*b[1], a[1]*b[0], a[1]*b[1]]
Out[665]: [array([ 5, 12]), array([ 7, 16]), array([15, 24]), array([21, 32])]
In [666]: np.array(_)
Out[666]:
array([[ 5, 12],
[ 7, 16],
[15, 24],
[21, 32]])
np.tensordot
是对np.dot
进行概括的尝试;对于像这样的二维数组,它不能做一些添加的转置不能做的事情。
从这个意义上说,您的结果不是 tensordot
。 dot
涉及sum of products
;你没有做任何总结。相反,它看起来更像是一个外部产品,或者可能是 kron
.
经过几次试验,我用 einsum
:
In [673]: np.einsum('ij,kj->ikj',a,b)
Out[673]:
array([[[ 5, 12],
[ 7, 16]],
[[15, 24],
[21, 32]]])
In [674]: _.reshape(-1,2)
Out[674]:
array([[ 5, 12],
[ 7, 16],
[15, 24],
[21, 32]])
einsum
与 dot
和 tensordot
一样是围绕乘积求和构建的,但让我们可以更好地控制哪些轴相乘,哪些轴相加。在这里,我们不求和。
我可以获得相同的 3d 数组:
In [675]: a[:,None,:]*b[None,:,:]
Out[675]:
array([[[ 5, 12],
[ 7, 16]],
[[15, 24],
[21, 32]]])
tensordot
根据文档,轴的默认值为 2:
In [714]: np.tensordot(a,b)
Out[714]: array(70)
In [715]: np.tensordot(a,b,axes=2)
Out[715]: array(70)
axes = 2
: (default) tensor double contraction :math:a:b
换句话说,将数组相乘,然后对所有轴求和。在我看来,使用 einsum
表示法更清楚:
In [719]: np.einsum('ij,ij',a,b)
Out[719]: 70
In [718]: np.tensordot(a,b,axes=0).shape
Out[718]: (2, 2, 2, 2)
axes = 0
: tensor product :math:a\otimes b
: tensor product a\otimes b
np.einsum('ij,kl',a,b)
我可以看到你想要的结果,或者至少你的 (2,2,2,2) 数组中的 Out[673]
版本,作为某种对角线子集。
我不太使用这些标量,例如 tensordot
的 axes
模式。在之前的 post 一两年里,我对它们感到困惑,但我感觉不太好。如果 einsum
.