【问题标题】:Python: Using Tensordot for tensor x matrix multiplicationPython:使用 Tensordot 进行张量 x 矩阵乘法
【发布时间】:2011-03-04 18:51:57
【问题描述】:

您好,我想以以下方式将张量与矩阵相乘:

尺寸

女: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)

我试过numpy.tensordot 来做到这一点,但没能做到。它可以做我想要的吗?如果不是,我怎么能在没有循环的情况下做到这一点。

基本上相当于

def f(W,V):    
    Z=[]    
    for i in range(len(W)):    
        Z.append(dot(W[i],V[i]))    
    return Z

谢谢

编辑:具体来说,这可以通过 tensordot 实现吗?

【问题讨论】:

  • 带有您的实际数据和预期输出的代码 sn-p 可以帮助您获得及时的答案。谢谢
  • 无论我多么努力,我一直在读它是“十点或点”而不是“张量点”
  • @Eric - 将此帐户与您的注册帐户合并将使您能够直接编辑您的问题。如果您希望我们这样做,请在未注册的个人资料中写下“请与 [目标帐户] 合并”后标记此问题以引起版主注意。

标签: python numpy


【解决方案1】:

np.einsum("abc,ac -> ab", w, v):

import numpy as np

def z_loop(w,v): # define it to check that `einsum()` gives necessary result
    z = np.empty(w.shape[:-1], dtype=w.dtype)
    for i in range(z.shape[0]):
        z[i,:] = np.dot(w[i,:], v[i,:])
    return z

w = np.random.uniform(size=(3,4,5))
v = np.random.uniform(size=w.shape[::2])
assert np.allclose(z_loop(w, v), np.einsum('abc,ac -> ab', w, v))

可能有更简单的变体(通过dot().reshape()),但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))

【讨论】:

  • 请注意,einsum 是新增功能,目前仅包含在 Numpy 的开发版本中。
  • @pv:正确。我应该提到它。
【解决方案2】:

怎么样

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. Sebastian 帖子中的“z_loop”相比:

print np.sum(np.abs(Z-z_loop(W,V)))

4.99600361081e-16

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多