numpy中的逐行乘法

时间:2016-11-03 23:36:38

标签: python arrays numpy matrix-multiplication

我有2个矩阵Amxn)和Bnxm)。我想得到矩阵Cnxmxm),这样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是否可能?

2 个答案:

答案 0 :(得分:3)

您可以使用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

形状

答案 1 :(得分:0)

如果您希望获得3D元素乘法的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只会将我们从函数调用开销中拯救出来,这可能会给我们带来一些性能提升。