python - 矩阵A乘以多维矩阵 "matrix-wise?"

标签 python numpy

我有一个 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] 将是形状为 (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 有点像外积。使用与之前相同的 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])

关于python - 矩阵A乘以多维矩阵 "matrix-wise?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30674587/

相关文章:

python - 无法将 InMemoryUploadedFile 写入线程中的本地文件 - Python

python - 定位矩阵中的不对称性

python - 如何强制 genfromtxt 读取 csv 作为记录数组?

python - Windows 更新后 Pygame 变慢

python - 无法在 Linux 上构建 PYQT

python - 使用 Tensorflow 多项式回归给出错误答案

Python - 编写一个在 + 和 - 之间交织的公式

python - numpy 索引文档中的错误示例?

python - 如何创建具有自定义起点和步长值的矩形网格

python - 如何使用 numpy 追加 2 个具有不同尺寸和形状的 numpy 图像数组