Python 将矩阵A乘以多维矩阵“;矩阵式?“;

Python 将矩阵A乘以多维矩阵“;矩阵式?“;,python,numpy,Python,Numpy,我有一个3d numpy数组u,shape(k,m,n),我试图计算一个新的数组upod,shape(k,m,n),使得upod[j]=np.dot(a,u[j]),其中a是一个完全不依赖于j的固定矩阵。我可以很容易地在最里面的索引上写一个循环,但是有没有更快/更好的方法呢?可以完成这项工作: result = numpy.einsum('ij,kjl->kil', A, u) 您还可以使其广播,因此如果将X和Y视为2D矩阵的数组,则以下调用将执行适当广播的点: result = num

我有一个3d numpy数组u,shape(k,m,n),我试图计算一个新的数组upod,shape(k,m,n),使得upod[j]=np.dot(a,u[j]),其中a是一个完全不依赖于j的固定矩阵。我可以很容易地在最里面的索引上写一个循环,但是有没有更快/更好的方法呢?

可以完成这项工作:

result = numpy.einsum('ij,kjl->kil', A, u)
您还可以使其广播,因此如果将
X
Y
视为2D矩阵的数组,则以下调用将执行适当广播的

result = numpy.einsum('...ij,...jk->...ik', X, Y)
例如,如果
X
具有形状
(3,4,5,6)
并且
Y
具有形状
(4,6,5)
,则
结果[1,2]
将是形状
(5,5)
的数组,等于
X[1,2]。点(Y[2])


您也可以使用
A.dot(u)
生成一个带有
A.dot(u)[i,j,k]==A[i,:].dot(u[j,:,k)
的结果数组。您需要一个带有
result[i,j,k]==A[j,:]的结果数组。dot(u[i,:,k])
;您可以使用
轴或使用
参数获得该结果数组

result = numpy.rollaxis(A.dot(u), 1)
einsum
使广播变得容易时,用于高维输入的
dot
有点像外部产品。如果您设置

result = numpy.rollaxis(X.dot(Y), axis=X.ndim-2, start=X.ndim+Y.ndim-3)
然后,
结果[1,2,3]
将是一个形状数组
(5,5)
等于
X[1,2]。点(Y[3])

U[j]是形状(m,n),而A是形状(l,m)。因此(n,l)=(m,n),i=n。