如何为范围内的 i 向量化 np.dot(vector_a, vector_b[:,i])?

How to vectorize np.dot(vector_a, vector_b[:,i]) for i in range?

我有一个形状为 (3,1) 的 numpy 数组 vector_a。如果我将它与形状 (1,3) 的 vector_b 相乘,我会得到形状 (3,3) 的结果。

现在,vector_b 实际上是一个 (3,N) numpy 列向量数组。我想将这些列向量中的每一个乘以 vector_a 以生成 N 个 3x3 矩阵,结果形状为 (N,3,3)

我做了以下事情:

r = np.dot(vector_a.reshape(1,3,1), vector_b.T.reshape(N, 1, 3))

我期望 r 的形状为 (N,3,3) 但我得到的形状为 (1,3,64,3)???我不知道为什么我会得到这种形状。 vector_a 和 vector_b 都是 C 连续的。在执行 vector_b.T.reshape(N, 1, 3) 之前,我尝试将 vector_b 转换为 F 连续,但我仍然得到相同的 r 形状 (1,3,64,3).

有人知道正确的表达方式吗?

作为替代解决方案,如果您使用 einsum,则可以避免为点积重新整形数组:

np.einsum('ij,jk->kij', vector_a, vector_b)

这是一个使用 broadcasting and ndarray.T -

vector_b.T[:,None,:]*vector_a