numpy中的逐行乘法

Column-by-row multiplication in numpy

我有 2 个矩阵 A (mxn) 和 B (nxm)。我会得到矩阵 C (nxmxm),这样 C[i]=A[:, i].dot(B[i, :])。换句话说,我想得到矩阵,其中第一个元素是 A 第一列和 B 第一行的点,第二个元素是 A 第二列和第二行的点B 等 例如对于这样的 AB

A = np.array([[1, 2, 3], [0, 1, -1]])
B = np.array([[4, 5], [6, 7], [8, 9]])

我想要这样的矩阵:

C = np.array([[[4, 5], [0, 0]],
          [[12, 14], [6, 7]],
          [[24, 27], [-8, -9]]])

没有循环可以吗?如果不是,是否有可能 A = B.T?

您可以使用 np.einsum:

np.einsum('ij,jk->ijk', A, B)

array([[[ 4,  5],
        [12, 14],
        [24, 27]],

       [[ 0,  0],
        [ 6,  7],
        [-8, -9]]])

编辑

来自您的评论:

np.einsum('ij,jk->jik', A, B)

会给你想要的形状C

如果您希望获得一个 3D 数组的逐元素乘法而不是矩阵乘法(涉及 sum-reduction),您可以使用 broadcasting 在一个矩阵中执行这些乘法矢量化的方式,像这样 -

A.T[...,None] * B[:,None]

运行时测试 -

In [524]: # Setup inputs
     ...: m,n = 200,200
     ...: A = np.random.rand(m,n)
     ...: B = np.random.rand(n,m)
     ...: 

In [525]: %timeit np.einsum('ij,jk->jik', A, B) #@Saullo Castro's soln
10 loops, best of 3: 27.1 ms per loop

In [526]: %timeit A.T[...,None] * B[:,None]
10 loops, best of 3: 25.1 ms per loop

不需要任何 sum-reduction,直接 broadcasting 只是让我们免于函数调用的开销,这可能会给我们带来一些性能改进。