[英]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)
您还可以使其广播,因此,如果将X
和Y
视为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
对高维输入是一种像外产品。 如果您设置了与以前相同的X
和Y
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.