【问题标题】:What is the fastest way to multiply two 2D numpy arrays?将两个 2D numpy 数组相乘的最快方法是什么?
【发布时间】:2018-11-04 13:26:36
【问题描述】:

我们应该找到一种方法,将大小为 (7403, 33) 的二维数组 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)

我只比 numpy dot 快 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)

【问题讨论】:

  • 您的timeit 结果表明最后3 个调用相同的过程。为什么需要它更快?
  • @roganjosh 我们正在学习 numpy。所以这是我们的测试。我已经尝试了我能想到的一切。有什么建议吗?
  • 我认为您应该开始分析一下结果的样子。将矩阵与其转置相乘有一个有趣的结构
  • @WillemVanOnsem 我不知道这会有什么帮助。但看起来行列式是 1。这有什么帮助?请解释一下?
  • 如果你们能帮忙的话。我真的很感激

标签: python arrays numpy multiplication


【解决方案1】:

我用 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)

【讨论】:

  • 你能解释一下为什么这个答案更快吗?
  • @hpaulj 。我希望有人可以向我解释这一点。我相信这与 BLAS en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms 有关
  • 我还没有深入研究这个。 dot 等尝试使用 BLAS 或其他标准库 (np.show_config())。我的猜测是linalg.blas. ... 调用更快,因为它是一个更直接的调用;开销和检查更少。阅读它的文档。
猜你喜欢
  • 2023-03-29
  • 2015-11-14
  • 2011-05-08
  • 2017-03-28
  • 2020-04-04
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多