python中的无环3D矩阵乘法

Jas*_*son 11 python numpy matrix operation

我期待在python(numpy)中执行以下操作.

Matrix A is M x N x R
Matrix B is N x 1 x R
Run Code Online (Sandbox Code Playgroud)

矩阵乘以AB = C,其中C是M×1×R矩阵.基本上每个M×N层的A(它们的R)是由B中的每个N x 1向量独立地矩阵相乘.我确信这是一个单行.我一直在尝试使用tensordot(),但我似乎在给我答案,我没想到.

我已经在Igor Pro编程了近10年,现在我正在尝试将它的页面转换为python.

Eel*_*orn 15

对不起,但是使用无价的np.einsum可以大大改善这个答案.

import numpy as np

D,M,N,R = 1,2,3,4
A = np.random.rand(M,N,R)
B = np.random.rand(N,D,R)

print np.einsum('mnr,ndr->mdr', A, B).shape
Run Code Online (Sandbox Code Playgroud)

请注意,它有几个优点:首先,它的速度快.np.einsum一般都经过了很好的优化,但是,np.einsum足够聪明,可以避免创建MxNxR临时数组,但直接在N上执行收缩.

但也许更重要的是,它非常易读.毫无疑问,这段代码是正确的; 而且你可以毫不费力地使它复杂得多.

请注意,如果您愿意,可以简单地从B和einsum语句中删除虚拟"D"轴.


Sve*_*ach 8

numpy.tensordot()是正确的方法:

a = numpy.arange(24).reshape(2, 3, 4)
b = numpy.arange(12).reshape(3, 1, 4)
c = numpy.tensordot(a, b, axes=[1, 0]).diagonal(axis1=1, axis2=3)
Run Code Online (Sandbox Code Playgroud)

编辑:这个版本的第一个版本是错误的,这个版本计算它应该更多的汉,并扔掉它的大部分.也许最后一个轴上的Python循环是更好的方法.

另一个编辑:我来的结论是,numpy.tensordot()不是最好的解决办法在这里.

c = (a[:,:,None] * b).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

会更有效率(虽然更难掌握).