Python:具有额外索引的快速矩阵乘法
Python: fast matrix multiplication with extra indices
我有两个数组,A 和 B,维度分别为 (l,m,n) 和 (l,m,n,n)。我想获得一个维度为 (l,m,n) 的数组 C,它是通过将 A 和 B 视为其第四个 (A) 以及第三个和第四个索引 (B) 中的矩阵而获得的。一个简单的方法是:
import numpy as np
#Define dimensions
l = 1024
m = l
n = 6
#Create some random arrays
A = np.random.rand(l,m,n)
B = np.random.rand(l,m,n,n)
C = np.zeros((l,m,n))
#Desired multiplication
for i in range(0,l):
for j in range(0,m):
C[i,j,:] = np.matmul(A[i,j,:],B[i,j,:,:])
但是,速度很慢(在我的 MacBook 上大约需要 3 秒)。最快、完全矢量化的方法是什么?
尝试使用einsum
.
它有很多用例,查看文档:https://numpy.org/doc/stable/reference/generated/numpy.einsum.html
或者,要了解更多信息,还可以在以下位置找到非常好的解释:https://ajcr.net/Basic-guide-to-einsum/
在你的情况下,似乎
np.einsum('dhi,dhij->dhj',A,B)
应该可以。此外,如果需要,您可以尝试 optimize=True 标志以获得更快的速度。
我有两个数组,A 和 B,维度分别为 (l,m,n) 和 (l,m,n,n)。我想获得一个维度为 (l,m,n) 的数组 C,它是通过将 A 和 B 视为其第四个 (A) 以及第三个和第四个索引 (B) 中的矩阵而获得的。一个简单的方法是:
import numpy as np
#Define dimensions
l = 1024
m = l
n = 6
#Create some random arrays
A = np.random.rand(l,m,n)
B = np.random.rand(l,m,n,n)
C = np.zeros((l,m,n))
#Desired multiplication
for i in range(0,l):
for j in range(0,m):
C[i,j,:] = np.matmul(A[i,j,:],B[i,j,:,:])
但是,速度很慢(在我的 MacBook 上大约需要 3 秒)。最快、完全矢量化的方法是什么?
尝试使用einsum
.
它有很多用例,查看文档:https://numpy.org/doc/stable/reference/generated/numpy.einsum.html
或者,要了解更多信息,还可以在以下位置找到非常好的解释:https://ajcr.net/Basic-guide-to-einsum/
在你的情况下,似乎
np.einsum('dhi,dhij->dhj',A,B)
应该可以。此外,如果需要,您可以尝试 optimize=True 标志以获得更快的速度。