【问题标题】:Fastest way to write the following编写以下内容的最快方法
【发布时间】:2020-01-15 18:26:28
【问题描述】:

我在 python 中执行以下操作:

tmp = np.empty_like(J,dtype=X.dtype)
for idx, (ii, jj) in enumerate(zip(I, J)):
    tmp[idx] = sum((X[ii] - X[jj])**2)

其中 X 是一个 50000 x 128 的 numpy 数组 并且 I 和 J 是大小为 (763690,) 的整数 numpy 数组(稀疏矩阵的列和行)

现在的问题是上述操作大约需要 30 秒才能完成,我看不出我需要做什么来加快速度。我知道它可以做得更快,因为我在 Matlab 中有一个类似的代码,几乎不需要任何时间。

我在这里做错了什么? 是否与内存跨步访问有关?,不使用内置函数?或者是其他东西?我应该并行化/矢量化它吗?

(我知道标题很糟糕,但我想不出一个好的方法来写它,欢迎提出建议!)

【问题讨论】:

    标签: python performance numpy optimization vectorization


    【解决方案1】:

    我们可以这样做:

    np.sum((X[I]-X[J])**2, axis=1)

    因此,在这里我们首先使用下标生成一个 763 690×128 矩阵X[I],其中对于I 中的每个项目,我们使用X 中的相应行。 X[j] 也是如此。然后我们将两者相减,得到一个 763 690×128 矩阵。我们可以按元素对项目进行平方,然后计算第一个轴上的总和。因此,这意味着对于每一行,我们都会获得一个值。因此,结果是一个具有 763 690 个元素的 flat 数组。

    【讨论】:

      【解决方案2】:

      Willems 方法效果很好!

      np.sum((X[I]-X[J])**2, axis=1)
      

      运行时间从~30s到~0.6s,非常感谢:)

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 2013-01-30
        • 1970-01-01
        • 2016-05-17
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 2012-12-29
        • 2017-12-31
        相关资源
        最近更新 更多