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

3
如果我有一个矩阵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.]]

第二列是什么? - Willem Van Onsem
我不明白这个问题,第二列是指什么? - dranobob
1个回答

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

如此优雅简洁。现在我要手动操作一下,以便理解为什么这样可以工作。 - dranobob
这个 einsum 怎么了? - Paul Panzer
@PaulPanzer 只是点积在求和缩减方面表现良好。只有当我们需要保持一个或多个轴对齐时,einsum 才会发挥作用,这里不是这种情况。 - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接