首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy中向量的Tensordot

numpy中向量的Tensordot
EN

Stack Overflow用户
提问于 2019-02-10 18:21:33
回答 1查看 1.2K关注 0票数 0

目前,我正在尝试使用numpy作为向量来创建一个tensordot。例如,假设我有以下变量:

代码语言:javascript
复制
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],在我们的例子中给出:

代码语言:javascript
复制
a x b = [[5,12], [7,16], [15, 24], [21, 32]]

我试过在不同的轴上使用张力点的许多组合,但是它从来没有给出我想要的结果:

例如,我尝试了以下几种方法:

代码语言:javascript
复制
np.tensordot(a,b)

这给了我array(70)

或者是np.tensordot(a,b, axes = 0)给了我

代码语言:javascript
复制
array([[[[ 5,  6],
     [ 7,  8]],

    [[10, 12],
     [14, 16]]],


   [[[15, 18],
     [21, 24]],

    [[20, 24],
     [28, 32]]]])

我也尝试使用不同的轴,如np.tensordot(a,b, axes = ([0], [1])),但没有成功.

有人能帮我吗?:)我确信这件事很琐碎,但我似乎错过了什么

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-10 18:38:20

代码语言:javascript
复制
In [663]: a = np.array([[1, 2], [3,4]]); b = np.array([[5,6], [7,8]])

这两个数组的一个简单点(矩阵积):

代码语言:javascript
复制
In [664]: a.dot(b)
Out[664]: 
array([[19, 22],
       [43, 50]])

您想要的数组:

代码语言:javascript
复制
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数组,它不能做一些添加了的转座子不能做的事情。

从这个意义上说,您的结果不是一个tensordotdot涉及到sum of products;您没有做任何计算。相反,它看起来更像是一个外部产品,或者可能是kron上的一个变体。

通过几次试验,我用einsum复制了你的数组

代码语言:javascript
复制
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一样,dottensordot都是以乘积之和为基础的,但是我们可以更好地控制哪些轴被乘以,哪些被加起来。在这里,我们不加任何。

我可以得到相同的3d数组:

代码语言:javascript
复制
In [675]: a[:,None,:]*b[None,:,:]
Out[675]: 
array([[[ 5, 12],
        [ 7, 16]],

       [[15, 24],
        [21, 32]]])

张紧点

根据文档,轴的默认值是2:

代码语言:javascript
复制
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符号可以更清楚地看到这一点:

代码语言:javascript
复制
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倍b
代码语言:javascript
复制
np.einsum('ij,kl',a,b)

我可以在(2,2,2,2)数组中看到您想要的结果,或者至少是Out[673]版本,作为某种对角线子集。

我不太使用这些标量,像axes模式的tensordot。在之前的一两篇文章中,我一直对它们感到困惑,但我没有很好的感觉。如果einsum的话,我更喜欢清晰。

How does numpy.tensordot function works step-by-step?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54619556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档