Python 两个2D numpy阵列相乘的最快方法是什么?

Python 两个2D numpy阵列相乘的最快方法是什么?,python,arrays,numpy,multiplication,Python,Arrays,Numpy,Multiplication,我们应该找到一种方法,将大小为(7403,33)的2D数组X与其转置相乘 我是说这个X*X.T 这个解应该比np.dot(X,X.T)快2.5倍。 我已经尝试了我能想到的一切 %timeit np.dot(X,X.T) %timeit np.matmul(X,X.T) %timeit X@X.T %timeit np.einsum("ij, jk -> ik",X,X.T) 我的速度只比小点快了1.5倍 3.17 s ± 14.9 ms per loop (mean ± std. dev

我们应该找到一种方法,将大小为(7403,33)的2D数组X与其转置相乘

我是说这个X*X.T

这个解应该比np.dot(X,X.T)快2.5倍。 我已经尝试了我能想到的一切

%timeit np.dot(X,X.T)
%timeit np.matmul(X,X.T)
%timeit X@X.T
%timeit np.einsum("ij, jk -> ik",X,X.T)
我的速度只比小点快了1.5倍

3.17 s ± 14.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.03 s ± 6.82 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.01 s ± 6.57 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.02 s ± 6.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

我用scipy找到了解决方案

%timeit np.dot(X,X.T)
%timeit np.matmul(X,X.T)
%timeit X@X.T
%timeit np.einsum("ij, jk -> ik",X,X.T)
%timeit linalg.blas.dgemm(alpha=1.0, a=X, b=X.T)

3.07 s ± 16.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.02 s ± 37.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.99 s ± 9.79 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2 s ± 5.97 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
306 ms ± 6.85 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

您的
timeit
结果表明最后3个调用相同的过程。为什么你需要它更快?@roganjosh我们正在学习numpy。所以这是我们的考验。我已经尝试了我能想到的一切。有什么建议吗?我想你应该开始分析结果会是什么样子。将矩阵与其转置相乘有一个有趣的结构。@WillemVanOnsem我不知道这有什么帮助。但看起来决定因素是1。这有什么帮助?请解释一下,如果你们能帮忙的话。我真的很感激你能解释一下为什么这个答案更快吗?@hpaulj。我希望有人能给我解释一下。我相信这与布拉斯有关,我还没有深入研究
dot
,因此人们尝试使用BLAS或其他标准库(
np.show\u config()
)。我猜,
linalg.blas调用更快,因为它是一个更直接的调用;减少了开销和检查。阅读它的文档。