Performance 如何将一个矩阵的点积矢量化为另一个矩阵的每一行?
如果我有一个矩阵a,我想得到a和B的每一行的点积Performance 如何将一个矩阵的点积矢量化为另一个矩阵的每一行?,performance,python-2.7,numpy,vectorization,array-broadcasting,Performance,Python 2.7,Numpy,Vectorization,Array Broadcasting,如果我有一个矩阵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]]) 如果目标是手动(或循环)执行: 使用一些转置和矩阵乘法- 与- 与- 运行时测试- In [123]: a = np.random.rand(
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]])
如果目标是手动(或循环)执行:
使用一些转置和矩阵乘法- 与- 与- 运行时测试-
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
第二栏是什么?我不是在问这个问题,第二栏是什么?如此优雅和简单。现在我要亲自去做这件事来理解为什么会这样。这件事上的
einsum
有什么问题吗?@PaulPanzer只是点积擅长求和<代码>einsum仅当我们需要保持一个或多个轴对齐时才起作用,而不是这里的情况。
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