如何为另一个矩阵的每一行向量化一个矩阵的点积?
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('ij,kj->ki',a,b)
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
如果我有一个矩阵 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('ij,kj->ki',a,b)
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