我有一个 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]
将是形状为 (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
得到这个或transpose
带有 axes
参数。
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])
。
关于python - 矩阵A乘以多维矩阵 "matrix-wise?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30674587/