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,它被视为驻留在最后两个索引中的矩阵堆栈并相应地广播。"
我有一长串 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,它被视为驻留在最后两个索引中的矩阵堆栈并相应地广播。"