如何在python中计算大型矩阵(平均过滤器)每个坐标的有效局部平均值
我有一个大矩阵,4000x4000 我需要计算这个矩阵的每个x,y的11x11窗口的局部平均值 一般来说,它一定是这样的如何在python中计算大型矩阵(平均过滤器)每个坐标的有效局部平均值,python,arrays,matrix,local,average,Python,Arrays,Matrix,Local,Average,我有一个大矩阵,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] 但这将运行很多时间 这是更有效的方法吗? 谢谢 您基本上需要一个二维卷积。Scipy可以为您做到这一点: 事实上,这里也有类似的答案,所以: 您可以使用动态编程技术使其速度快很多倍。通过从左上角开始,从左到右移动,然后
for x in range(4000)
for y in range(4000)
b[x,y]=mean(a[x-5:x+5,y-5:y+5]
但这将运行很多时间
这是更有效的方法吗?
谢谢 您基本上需要一个二维卷积。Scipy可以为您做到这一点: 事实上,这里也有类似的答案,所以:
您可以使用动态编程技术使其速度快很多倍。通过从左上角开始,从左到右移动,然后从上到下,预处理矩阵,将每个单元格设置为其值与上面的单元格(如果存在)和左边的单元格(如果存在)之和。当到达末尾时,右下角的值应该是整个矩阵的总和
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次遍历,而不对每个元素进行迭代。您不希望在Python代码中执行此计算。numpy可能可以做到这一点,但他们的页面目前速度非常慢。你试过使用xrange吗?你需要多大的效率?