【问题标题】:How to calculate efficient local average of each coordinate of large matrix (average filter) in python如何在python中计算大矩阵(平均滤波器)每个坐标的有效局部平均值
【发布时间】:2010-11-02 14:47:08
【问题描述】:

我有大矩阵,4000x4000 我需要为这个矩阵的每个 x,y 计算 11x11 窗口的局部平均值 一般应该是这样的

for x in range(4000)
  for y in range(4000)
    b[x,y]=mean(a[x-5:x+5,y-5:y+5]

但这会运行很多时间 这是一种更有效的方法吗? 谢谢。

【问题讨论】:

  • 您不想在 Python 代码中进行此计算。 numpy 可能可以做到这一点,但他们的页面目前非常慢。
  • 你试过使用 xrange 吗?您需要提高多少效率?

标签: python arrays matrix local average


【解决方案1】:

你本质上想要一个二维卷积。 Scipy 可以为您做到这一点:http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html

事实上,这里有一个类似的答案: 2d convolution using python and numpy

【讨论】:

    【解决方案2】:

    您可以使用动态编程技术使其速度提高很多倍。通过从左上角开始并从左到右然后从上到下移动来预处理矩阵,将每个单元格设置为其值与上面的一个(如果存在)和左边的一个(如果存在)的总和.到最后,右下角的值应该是整个矩阵的总和。

    for x in xrange(4000):
        for y in xrange(4000):
            c[x,y] = a[x,y]
            if x > 0:
                c[x,y] += c[x-1,y]
            if y > 0:
                c[x,y] += c[x,y-1]
    

    现在您可以通过从右上角减去左上角来获得任何矩形区域的总和:例如。在这种情况下,11x11 区域的总和将是

    c[x+5,y+5]-c[x-5,y-5]
    

    然后你可以只除以窗口的大小得到局部平均值:

    b[x,y] = (c[x+5+,y+5]-c[x-5,y-5])/121
    

    现在不必为矩阵中的每个元素迭代超过 121 个点,您只需在矩阵上进行 2 次遍历,而不需要对每个元素进行迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2021-07-24
      • 1970-01-01
      • 2017-09-10
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多