繁体   English   中英

乘法矩阵A乘以多维矩阵“矩阵方向?”

[英]Multiplying matrix A times multi-dimensional matrix “matrix-wise?”

我有一个3d numpy数组u,形状为(k,m,n),我试图计算一个新的数组uprod,形状为(k,m,n),使得uprod [j] = np.dot(A, u [j]),其中A是一个完全不依赖j的固定矩阵。 我可以轻松地在最内层的索引上编写一个循环,但是有没有更快/更好的方法呢?

np.einsum可以完成以下工作:

result = numpy.einsum('ij,kjl->kil', A, u)

您还可以使其广播,因此,如果将XY视为2D矩阵的数组,则以下调用将执行适当广播的dot

result = numpy.einsum('...ij,...jk->...ik', X, Y)

例如,如果X形状为(3, 4, 5, 6)Y形状为(4, 6, 5) ,则result[1, 2]将是形状等于( X[1, 2].dot(Y[2]) (5, 5)的数组(5, 5) X[1, 2].dot(Y[2])


您也可以使用dot进行此操作。 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])的结果数组; 您可以使用rollaxis获得此结果,也可以使用axes参数进行transpose

result = numpy.rollaxis(A.dot(u), 1)

einsum使得广播容易, dot对高维输入是一种像外产品。 如果您设置了与以前相同的XY

result = numpy.rollaxis(X.dot(Y), axis=X.ndim-2, start=X.ndim+Y.ndim-3)

那么result[1, 2, 3]将是形状(5, 5)等于X[1, 2].dot(Y[3])的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM