Python numpy中向量的张量度
我目前正在尝试使用numpy为向量创建一个tensordot。例如,假设我有以下变量:Python numpy中向量的张量度,python,numpy,tensordot,Python,Numpy,Tensordot,我目前正在尝试使用numpy为向量创建一个tensordot。例如,假设我有以下变量: a = [np.array([1, 2]), np.array([3,4])] b = [np.array([5,6]), np.array([7,8])] 我想计算“向量的张量积”,即[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]] 我尝试了许多沿不同轴使
a = [np.array([1, 2]), np.array([3,4])]
b = [np.array([5,6]), np.array([7,8])]
我想计算“向量的张量积”,即[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)
这给了我数组(70)
或np.tensordot(a,b,轴=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
的一种尝试;对于这样的2d数组,它不能做一些添加的转置不能做的事情
从这个意义上讲,您的结果不是一个tensordot
。dot
涉及积和
;您没有做任何求和。相反,它看起来更像是一个外积,或者可能是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 ba\\otimes b
Out[673]
版本,作为某种对角子集
我不经常使用这些标量轴,比如tensordot
模式。在前一两篇文章中,我对它们感到困惑,但我感觉不太好。我更喜欢einsum
的清晰性
这两个阵列的简单点(矩阵积):
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
涉及积和
;您没有做任何求和。相反,它看起来更像是一个外积,或者可能是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 ba\\otimes b
Out[673]
版本,作为某种对角子集
我不经常使用这些标量轴,比如tensordot
模式。在前一两篇文章中,我对它们感到困惑,但我感觉不太好。我更喜欢einsum
的清晰性
向我们展示一些
tensordot
应用程序,以及它们的错误。我试图解释tensordot
结果。但是,是什么让你认为tensordot
应该给你期望的结果呢?我的问题的另一种解释方式是什么是tensordot
?我知道这个numpy
函数。但是听起来你在尝试生产一个在别处定义的产品(数学理论?)。如果是的话,在哪里?非常感谢你下面的回答,这正是我要寻找的!至于我的目标,我正在定义f和g两个函数,它们在张量空间中的图像在所有x处的值,即[f(x_1),f(x_2),…,f(x_n)]对于x_1,…,x_n是f和g的有限定义集。然后,我定义的乘积可以被视为函数h的值的平坦向量,函数h被定义为函数f x的张量积。向我们展示了一些tensordot
应用程序,以及错误之处。我试图解释tensordot
结果是什么让你认为tensordot
应该给你期望的结果?我的问题的另一种解释是什么是tensordot
?我知道这个numpy
函数。但听起来你好像在试图生产一个在别处定义的产品(数学理论?).如果是,在哪里?非常感谢你下面的回答,这正是我要找的!至于我的目标,我正在定义f和g两个函数,它们在张量空间中的图像在所有x处的值,即[f(x_1),f(x_2),…,f(x_n)]对于x_1,…,x_n是f和g的有限定义集。然后,我定义的乘积可以被视为函数h的值的平坦向量,定义为函数f x g的张量积