我一直在努力寻找解决方案,但似乎找不到。
在不使用for循环的情况下,我想执行矩阵向量乘法。
设A是N-m-N矩阵阵列,设B是N-N向量阵列
代码等效为:
# create a Nxn matrix as the output
C = np.zeros(N, n)
for N in range(A.shape[0]):
C[N] =A[N] @ B[N]
简单地做A @ B
的问题是numpy假设B是矩阵,而不是广播矩阵向量积。同样,这是矩阵N和向量N的列空间中的矩阵乘法。
我试着寻找np.einsum和np.tensordot解决方案,但似乎找不到。
np.einsum
应该可以解决您的问题。如果有矩阵mxn
的N阵列A
和向量nx1
的N阵列,则C应该是向量mx1
的N阵列。那么,使用np.einsum
将是获得正确索引的问题。
例如,给定
# these values are illustrative
N, m, n = 4, 5, 3
A = np.random.randint(10, 100, (N, m, n))
B = np.random.randint(5, 10, (N, n))
您的代码
C = np.empty((N, m)) # notice the dimension here is different from your code
for i in range(A.shape[0]):
C[i] = A[i] @ B[i]
可以使用np.einsum
通过将维度映射到正确的索引来重写,如@hpauljNxmxn
,Nxn
->Nxm
i j k
、i k
->i j
C = np.einsum("ijk,ik->ij", A, B)
有关如何使用np.einsum
的更多信息,您可以在这个链接中找到一个很好的解释。