【问题标题】:Product of matrix and 3-way tensor in Numpy/TheanoNumpy/Theano 中矩阵和三向张量的乘积
【发布时间】:2017-03-30 04:16:52
【问题描述】:

我想计算一个矩阵X 的形状(a, b) 和一个张量Y 的形状(a, b, c) 的乘积,结果Z 的形状(a, c) 和行i (i = 1...a)Z 是行 iX 和矩阵切片 (i, :, :)Y 的乘积。

在 NumPy 和 Theano 中是否有一种方便的方法来执行此操作,最好使用内置函数,并且不使用循环或计算不必要的矩阵乘积?

【问题讨论】:

    标签: python numpy matrix linear-algebra theano


    【解决方案1】:

    有了你的描述,写一个einsum 表达式很容易:

    In [428]: X=np.arange(6).reshape(2,3)
    In [429]: Y=np.arange(2*3*4).reshape(2,3,4)
    
    In [431]: np.einsum('ab,abc->ac',X,Y)
    Out[431]: 
    array([[ 20,  23,  26,  29],
           [200, 212, 224, 236]])
    In [432]: _.shape
    Out[432]: (2, 4)
    

    np.matmul@ 运算符有点棘手,虽然可能一样快:

    In [438]: (X[:,None,:]@Y).squeeze()
    Out[438]: 
    array([[ 20,  23,  26,  29],
           [200, 212, 224, 236]])
    

    中间阶段的形状为(a,1,c),即

    (a,1,b)@(a,b,c)=>(a,1,c)   # with sum on b
    

    【讨论】:

    • 谢谢,这对 NumPy 来说是完美的。有没有办法用 Theano 做到这一点?似乎 Theano 没有与 np.einsum 和 np.matmul 等效的功能。
    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 2019-04-21
    • 1970-01-01
    • 2017-07-20
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多