目前,我正在尝试使用numpy作为向量来创建一个tensordot。例如,假设我有以下变量:
a = [np.array([1, 2]), np.array([3,4])]
b = [np.array([5,6]), np.array([7,8])]我想计算“向量的张量乘积”,即[a*b,a*b1,a1*b,a1*b1],在我们的例子中给出:
a x b = [[5,12], [7,16], [15, 24], [21, 32]]我试过在不同的轴上使用张力点的许多组合,但是它从来没有给出我想要的结果:
例如,我尝试了以下几种方法:
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])),但没有成功.
有人能帮我吗?:)我确信这件事很琐碎,但我似乎错过了什么
谢谢。
发布于 2019-02-10 18:38:20
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的尝试;对于这样的2d数组,它不能做一些添加了的转座子不能做的事情。
从这个意义上说,您的结果不是一个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]]])张紧点
根据文档,轴的默认值是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:(默认)张量双收缩:数学: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:张量积:数学:a\\otimes b:张量积a\o倍bnp.einsum('ij,kl',a,b)我可以在(2,2,2,2)数组中看到您想要的结果,或者至少是Out[673]版本,作为某种对角线子集。
我不太使用这些标量,像axes模式的tensordot。在之前的一两篇文章中,我一直对它们感到困惑,但我没有很好的感觉。如果einsum的话,我更喜欢清晰。
https://stackoverflow.com/questions/54619556
复制相似问题