如何为另一个矩阵的每一行向量化一个矩阵的点积?

How to vectorize a dot product of one matrix for every row of another?

如果我有一个矩阵 A,我想得到 A 与 B 的每一行的点积。

import numpy as np

a = np.array([[1.0, 2.0],
              [3.0, 4.0]])

b = np.array([[1.0, 1.0],
              [2.0, 2.0],
              [3.0, 3.0]])

如果目标是手动(或循环):

c = np.array([np.dot(a, b[0])])
c = np.append(c, [np.dot(a, b[1])], axis=0)
c = np.append(c, [np.dot(a, b[2])], axis=0)

print(c)

c = [[  3.   7.]
     [  6.  14.]
     [  9.  21.]]

使用 np.dot -

进行一些转置和矩阵乘法
a.dot(b.T).T
b.dot(a.T)

np.einsum-

np.einsum('ij,kj->ki',a,b)

np.tensordot-

np.tensordot(b,a,axes=((1,1)))

运行时测试 -

In [123]: a = np.random.rand(2000, 2000)
     ...: b = np.random.rand(3000, 2000)
     ...: 

In [124]: %timeit a.dot(b.T).T
     ...: %timeit b.dot(a.T)
     ...: %timeit np.einsum('ij,kj->ki',a,b)
     ...: %timeit np.tensordot(b,a,axes=((1,1)))
     ...: 
1 loops, best of 3: 234 ms per loop
10 loops, best of 3: 169 ms per loop
1 loops, best of 3: 7.59 s per loop
10 loops, best of 3: 170 ms per loop