【问题标题】:Speed up a loop with values replacement通过值替换加速循环
【发布时间】:2021-03-06 12:49:50
【问题描述】:

我有一个二维矩阵。我想将每个值与其周围框中的值的平均值进行比较(不包括值本身)。如果该值大于平均值加上 3sigma,它将被框中值的平均值替换。然后我在矩阵上重复这个过程五次。 所以,我有这些代码在我的小示例矩阵中工作得很好,但是当我转到真正的(750X2000)时,它需要永远运行。有没有办法加快这个循环?我对 python 比较陌生,所以也许有一些我没有看到的基本的、明显的东西。

    import numpy as np
    mat= [[ 0 , 2 , 4 , 60000 , 8],[10 ,12, 14000, 16, 18],[20 ,22, 625, 26, 28],[30, 32,34, 36, 38],[10000, 42, 44, 46, 48]] 
    mat=np.array(mat)
    print(mat)
    print(mat.shape[0])
    print('###############')
    b=0
    while b<5:
          for i in range(mat.shape[0]):
               for j in range(mat.shape[1]):
                   chunk = mat[max(0,i-1):i+2, max(0,j-1):j+2]
                   c = np.setdiff1d(chunk,mat[i,j])
                   media_c=np.mean(c)
                   #print(media_c)
                   sdv=np.std(c)
                   if mat[i,j]>media_c+3*sdv:
                       mat[i,j]=media_c
        
          b+=1
    
     print(mat)

【问题讨论】:

    标签: python performance matrix multidimensional-array


    【解决方案1】:

    我会做一些不同的事情:

    1. 您应该使用相同填充的总和池(因此输出大小相同),最好在 GPU 上使用 tensorflow 执行此操作,未定义总和池,但您可以轻松地使用平均池然后乘以过滤器的字段数,例如9 (3x3),你当然也可以在numpy 做,我没有这方面的经验。

    2. 之后,你可以从 sum-pooled 中减去原始图像,这样你就可以得到差异,非常快的操作

    3. 在那里你可以与你的 sigma 进行比较,我会在 numpy 或 tensorflow 中使用 argwhere,比遍历每个元素要快得多

    这只是一个概念,我现在没有时间创建代码sn-ps,如果需要的话可能会在以后添加。

    【讨论】: