Python:使用Tensordot进行张量x矩阵乘法

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])

嗨,我想用下列方式将张量与矩阵相乘:

尺寸

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]))    
    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)))