Python numpy中向量的张量度

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]] 我尝试了许多沿不同轴使

我目前正在尝试使用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]]
我尝试了许多沿不同轴使用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 b
    :张量积a\otimes b
我可以看到您想要的结果,或者(2,2,2,2)数组中的
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 b
    :张量积a\otimes b
我可以看到您想要的结果,或者(2,2,2,2)数组中的
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的张量积