首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy张量:张量额叶上的点

Numpy张量:张量额叶上的点
EN

Stack Overflow用户
提问于 2016-03-17 21:29:55
回答 2查看 948关注 0票数 1

我试图用三维张量的正面切片进行矩阵乘法,如下所示。如果X.shape == (N, N)Y.shape == (N, N, Y),则产生的张量应该是(N, N, Y)形状的。

实现这一目标的适当np.tensordot语法是什么?

我试图将自己限制在np.tensordot上,而不是np.einsum上,因为我以后想把这个解决方案翻译成Theano。不幸的是,Theano还没有实现np.einsum

图形改编自本论文关于张量乘法。非张力点的答案等价于以下内容

代码语言:javascript
复制
tensor = np.random.rand(3, 3, 2)
X = np.random.rand(3, 3)

output = np.zeros((3, 3, 2))
output[:, :, 0] = X.dot(tensor[:, :, 0])
output[:, :, 1] = X.dot(tensor[:, :, 1])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-17 21:45:19

axis=1表示Xaxis=0表示tensor,因此基于np.tensordot的解决方案将是-

代码语言:javascript
复制
np.tensordot(X,tensor, axes=([1],[0]))

解释:

让我们以迭代解决方案作为解释,并在其中进行第一次迭代:

代码语言:javascript
复制
output[:, :, 0] = X.dot(tensor[:, :, 0])

在点积中,第一个输入是X,它的形状是(N x N),第二个输入是tensor[:, :, 0],它是沿着最后一个轴的第一个切片,形状是(N x N)。该点积导致沿X的第二轴,即axis=1和沿第一轴,即tensor[:, :, 0]axis=0减小,这也恰好是整个阵列tensor的第一轴。现在,这在所有迭代中都会继续。因此,即使在全局情况下,我们也需要这样做:在X中减少/丢失X,在张量中减少/丢失axis=0,就像我们所做的那样!

整合@hlin117的答案

代码语言:javascript
复制
np.tensordot(X,tensor, axes=([1],[0]))

时间安排:

代码语言:javascript
复制
>>> N = 200
>>> tensor = np.random.rand(N, N, 30)
>>> X = np.random.rand(N, N)
>>> 
>>> %timeit np.tensordot(X, tensor, axes=([1], [0]))
100 loops, best of 3: 14.7 ms per loop
>>> %timeit np.tensordot(X, tensor, axes=1)
100 loops, best of 3: 15.2 ms per loop
票数 1
EN

Stack Overflow用户

发布于 2016-03-17 21:46:36

上面的内容相当于以下内容:

代码语言:javascript
复制
np.tensordot(X, tensor, axes=1)

axes=1,因为(如果axes参数是标量的话) N应该是第一个参数的最后一个轴,而N应该是第二个参数的第一个轴。

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

https://stackoverflow.com/questions/36072042

复制
相关文章

相似问题

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