Python:使用Tensordot进行张量x矩阵乘法
嗨,我想用下列方式将张量与矩阵相乘: 尺寸 W:Python:使用Tensordot进行张量x矩阵乘法,python,numpy,Python,Numpy,嗨,我想用下列方式将张量与矩阵相乘: 尺寸 W:a x b x c V:a x c 我想要这样的Z Z[i]=dot(W[i],V[i]) 然后Z是尺寸a x((b x c)。(c x 1)),所以(a x b) 我试着做这件事,但一直没能做到。它能做我想要的吗?如果没有循环,我如何才能做到这一点 基本上相当于 def f(W,V): Z=[] for i in range(len(W)): Z.append(dot(W[i],V[i])
a x b x c
V:a x c
我想要这样的Z
Z[i]=dot(W[i],V[i])
然后Z是尺寸a x((b x c)。(c x 1)),所以(a x b)
我试着做这件事,但一直没能做到。它能做我想要的吗?如果没有循环,我如何才能做到这一点
基本上相当于
def f(W,V):
Z=[]
for i in range(len(W)):
Z.append(dot(W[i],V[i]))
return Z
谢谢
编辑:具体来说,使用tensordot可以实现这一点吗?:
可能有更简单的变体(通过dot()
,重塑()
),但任务描述中最明显的变体是einsum()
def z_dot(w, v):
z = np.dot(w, v[:,...,np.newaxis])
z = z.reshape(z.shape[:-1])
return np.diagonal(z, axis2=-1).T
assert np.allclose(z_dot(w, v), np.einsum('abc,ac -> ab', w, v))
那怎么办
import numpy as np
a,b,c=3,5,6
r=np.random.random
W = r((a,b,c))
V = r((a,c))
Z = np.sum(W*V[:,np.newaxis,:],axis=2)
不使用循环或更新的功能,应该相当快。与J.F.塞巴斯蒂安帖子中的“z_循环”相比:
print np.sum(np.abs(Z-z_loop(W,V)))
为
4.99600361081e-16
提供一个包含您的实际数据和预期输出的代码片段,可能有助于您收到提示答案。谢谢不管我怎么努力,我一直在读它是“十或点”而不是“张量点”@Eric-将此帐户与您的注册帐户合并将使您能够直接编辑您的问题。如果您希望我们这样做,请在未注册帐户的配置文件中写下“请与[target account]合并”后标记此问题,以供版主注意。请注意,einsum
是一个新添加,目前仅包含在Numpy的开发版本中。@pv:正确。我应该提一下。
print np.sum(np.abs(Z-z_loop(W,V)))