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

时间:2017-03-03 21:30:14

标签: performance python-2.7 numpy vectorization numpy-broadcasting

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

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.]]

1 个答案:

答案 0 :(得分:2)

使用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