我想计算形状为
(a, b)
的矩阵X
和形状为 (a, b, c)
的张量Y
的乘积,使得结果Z
具有形状(a, c)
,而Z
的行i
(i = 1...a)
是X
的行i
和Y
的矩阵切片(i, :, :)
的乘积。
有没有一种方便的方法可以在 NumPy 和 Theano 中做到这一点,理想情况下使用内置函数,而不使用循环或计算不必要的矩阵积?
使用您的描述,编写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