【问题标题】:Best way to count Greater Than in numpy 2d array在 numpy 二维数组中计算大于的最佳方法
【发布时间】:2019-04-15 23:01:26
【问题描述】:

结果是大小为 300000 的 2d numpy 数组

for i in range(np.size(results,0)):  
     if results[i][0]>=0.7:  
        count+=1

在这个 python 代码中我需要 0.7 秒,但我在 C++ 代码中运行它,它需要不到 0.07 秒。
那么如何让这段python代码尽可能快呢?

【问题讨论】:

    标签: python arrays performance numpy


    【解决方案1】:

    在进行速度数值计算时,尤其是在 Python 中,如果可能,您永远不想使用 for 循环。 Numpy 针对“矢量化”计算进行了优化,因此您希望将通常在 for 循环中所做的工作传递给特殊的 numpy 索引和函数,例如 where

    我对 300,000 x 600 的从 0 到 1 的随机值数组进行了快速测试,结果如下。

    您的代码,非矢量化,带有一个 for 循环:
    每次运行 226 毫秒

    %%timeit
    count = 0
    for i in range(np.size(n,0)):  
         if results[i][0]>=0.7:  
            count+=1
    

    emilaz 解决方案:
    每次运行 8.36 毫秒

    %%timeit
    first_col = results[:,0]
    x = len(first_col[first_col>.7])
    

    Ethan 的解决方案:
    每次运行 7.84 毫秒

    %%timeit
    np.bincount(results[:,0]>=.7)[1]
    

    最好的结果是
    每次运行 6.92 毫秒

    %%timeit
    len(np.where(results[:,0] > 0.7)[0])
    

    所有 4 种方法都产生了相同的答案,我的数据是 90,134。希望这会有所帮助!

    【讨论】:

    • len(np.where(results[:,0] > 0.7)[0]), 0.0003s
    • 请注意,结果很大程度上取决于矩阵的形状,尤其是您正在迭代的列的长度。这可能导致不同的排名(请参阅每个答案下方的@bitnicks 速度测量)
    【解决方案2】:

    试试

    first_col=results[:,0]
    res =len(first_col[first_col>.7])
    

    根据矩阵的形状,这可能比您的方法快 2-10 倍。

    【讨论】:

    • 很高兴我能帮上忙 :) 如果这是您要查找的内容,请不要忘记将您的问题标记为已回答。
    【解决方案3】:

    您可以尝试以下方法:

    np.bincount(results[:,0]>=.7)[1]
    

    不确定它是否更快,但应该会产生正确的答案

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2019-07-31
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2016-12-09
      相关资源
      最近更新 更多