Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何将一个矩阵的点积矢量化为另一个矩阵的每一行?_Performance_Python 2.7_Numpy_Vectorization_Array Broadcasting - Fatal编程技术网

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

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(

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