NumPy二维移动平均

19

我有一个二维 numpy 数组。我想要对于每个条目,取其最靠近的 n 个条目的平均值,就像对一维数组进行滑动平均一样。有什么最简洁的方法可以做到这一点?


1
你如何定义“n个最近的条目”?这是以当前条目为中心的正方形区域(例如5x5)吗? - Peter Gibson
@PeterGibson 那样做很好 - 区域的确切形状对我的用例并不重要。 - Sean Mackesey
1个回答

31

这类似于将滤镜应用于图像的概念。

幸运的是,scipy.ndimage.filters有许多函数可实现此功能。您需要的函数是scipy.ndimage.uniform_filter

可以像这样使用:

a
=> 
array([[  0.,   1.,   2.,   3.,   4.],
       [  5.,   6.,   7.,   8.,   9.],
       [ 10.,  11.,  12.,  13.,  14.],
       [ 15.,  16.,  17.,  18.,  19.],
       [ 20.,  21.,  22.,  23.,  24.]])

uniform_filter(a, size=3, mode='constant')
=> 
array([[  1.33333333,   2.33333333,   3.        ,   3.66666667,          2.66666667],
       [  3.66666667,   6.        ,   7.        ,   8.        ,          5.66666667],
       [  7.        ,  11.        ,  12.        ,  13.        ,          9.        ],
       [ 10.33333333,  16.        ,  17.        ,  18.        ,         12.33333333],
       [  8.        ,  12.33333333,  13.        ,  13.66666667,          9.33333333]])

如果你想使用5x5的滤波器,请使用size=5mode选项控制边缘的处理方式。你没有指定如何处理边缘。 在这个例子中,“constant”模式意味着它将数组边界外的每个项目都视为0的常量值(0是默认值,可以被覆盖)。


1
谢谢,但是链接的文档有点简略。如果我的图像叫做 img,我想计算每个像素周围 5x5 网格的平均值,我应该使用什么精确的调用呢? - Sean Mackesey
很遗憾你不能为每个轴指定不同的“模式”。等等,我想那样也行不通。 - abcd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接