【问题标题】:Averaging over array neighbour values平均数组邻居值
【发布时间】:2020-10-03 23:29:24
【问题描述】:

给定如下的 [x,y] 数组,我想返回一个新数组,其中包含 3x3 子数组的平均值。例如。以下数组:

image = [[7, 4, 0, 1], 
         [5, 6, 2, 2], 
         [6, 10, 7, 8], 
         [1, 4, 2, 0]]

应该返回

new_image = [[5, 4],
            [4, 4]]

我已经做到了这一点,我可以将新数组作为表单列表获取:

new_image = [5,4,4,4]

这是我的方法:

h = list(range(1,len(image)-1))
w = list(range(1,len(image[0])-1))

def square_sum(image,i,j):
    sum = image[i-1][j-1] + image[i-1][j] + image[i][j-1] + image[i+1][j] + image[i][j+1] + image[i+1][j+1] + image[i][j] + image[i-1][j+1] + image[i+1][j-1] 
    return sum//9

new_image = []

for i in h:
    for j in w:
        new_image.append(square_sum(image,i,j))
return(new_image)

所以我的问题是如何让我的输出成为一个数组而不是一个列表。 (我已经意识到用 Numpy 做这件事要容易得多,但想看看我如何才能按照上述方法解决它)。

【问题讨论】:

  • 我不明白这些值中的任何一个如何平均为 5 或 4
  • @NicolasGervais 我已经编辑了问题来解释 - 这是 3x3 的平均值。
  • 嗨,就像原始数组中每个元素周围的 3x3 子数组的平均值一样。例如。在原始数组中取 [1,1] = 6。以 6 为中心的 3x3 子数组之和为 47。因此,平均值为 5。
  • 这可能是相关的 - stackoverflow.com/questions/43086557/…(使用 3x3 卷积过滤器,其中每个值都是 1/9)。

标签: python arrays list


【解决方案1】:

您必须手动创建外部和内部列表:

new_image = []

for i in h:
    new_image.append([])  # at each height, add a new inner list
    for j in w:
        new_image[-1].append(square_sum(image,i,j))
        #         ^ append to the last create inner list

for ... in ...: some_list.append(...) 形式的模式通常适合写成列表推导式。两层都可以通过嵌套推导式同时表达:

 #           v outer layer                                 v
 new_image = [[square_sum(image,i,j) for j in w] for i in h]
 #            ^ inner layer                    ^

【讨论】:

    【解决方案2】:

    你可以用list comprehension替换最后的循环:

    new_image = [[square_sum(image,i,j) for j in w] for i in h]
    

    在您的示例中,它返回:

    [[5, 4], [4, 4]]
    

    【讨论】:

      【解决方案3】:

      由于我们知道每行中的元素数量,我们可以继续将行而不是元素附加到new_image。代码如下:

      image = [[7, 4, 0, 1], 
               [5, 6, 2, 2], 
               [6, 10, 7, 8], 
               [1, 4, 2, 0]]
      
      h = list(range(1,len(image)-1))
      w = list(range(1,len(image[0])-1))
      
      def square_sum(image,i,j):
          sum = image[i-1][j-1] + image[i-1][j] + image[i][j-1] + image[i+1][j] + image[i][j+1] + image[i+1][j+1] + image[i][j] + image[i-1][j+1] + image[i+1][j-1] 
          return sum//9
      
      new_image = []
      
      for i in h:
          temp_row = []
          for j in w:
              temp_row.append(square_sum(image,i,j))
          new_image.append(temp_row)
      

      【讨论】:

        【解决方案4】:

        如果你愿意使用 scipy,可以用 1/9 内核做卷积:

        from scipy.signal import convolve2d
        
        
        image = [[7, 4, 0, 1], 
                 [5, 6, 2, 2], 
                 [6, 10, 7, 8], 
                 [1, 4, 2, 0]]
        
        
        kernel = np.ones([3,3]) / 9
        
        convolve2d(image, kernel, mode='valid').astype(int)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-31
          • 1970-01-01
          • 1970-01-01
          • 2021-09-28
          • 2011-06-17
          • 2011-11-12
          • 1970-01-01
          相关资源
          最近更新 更多