Python 将矩阵A乘以多维矩阵“;矩阵式?“;
我有一个3d numpy数组u,shape(k,m,n),我试图计算一个新的数组upod,shape(k,m,n),使得upod[j]=np.dot(a,u[j]),其中a是一个完全不依赖于j的固定矩阵。我可以很容易地在最里面的索引上写一个循环,但是有没有更快/更好的方法呢?可以完成这项工作: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
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。