NumPy:一次对许多小矩阵进行点积

NumPy: Dot product for many small matrices at once

我有一长串 3×3 矩阵,例如,

import numpy as np

A = np.random.rand(25, 3, 3)

并且对于每个小矩阵,我想执行一个外积 dot(a, a.T)。列表理解

import numpy as np

B = np.array([
    np.dot(a, a.T) for a in A
    ])

有效,但效果不佳。一个可能的改进可能是只做 一个 dot 产品,但我在为它正确设置 A 时遇到了麻烦。

有什么提示吗?

仔细查看代码并尝试获得更大的图片可以揭示其中的一些信息。第一个轴需要 A 与其转置版本之间的对齐,因为我们正在为代码中的这两个版本迭代第一个轴。然后,A 及其转置版本沿第三轴减少。现在,为了保持对齐并执行这样的点积缩减,np.einsum 中有一个很好的向量化选项。因此,为了解决我们的问题,实现看起来像这样 -

B = np.einsum('ijk,ilk->ijl',A,A)

您可以获得转置矩阵列表A.swapaxes(1, 2),以及您想要的产品列表A @ A.swapaxes(1, 2)

import numpy as np

A = np.random.rand(25, 3, 3)

B = np.array([
    np.dot(a, a.T) for a in A
    ])

C = A @ A.swapaxes(1, 2)

(B==C).all()     # => True

@ operator is just syntactic sugar for np.matmul, about which the documentation 说“如果任一参数是 N-D,N > 2,它被视为驻留在最后两个索引中的矩阵堆栈并相应地广播。"