Numpy 二维移动平均线

Posted

技术标签:

【中文标题】Numpy 二维移动平均线【英文标题】:Numpy Two-Dimensional Moving Average 【发布时间】:2014-05-24 21:08:54 【问题描述】:

我有一个 2d numpy 数组。我想对每个条目取 n 个最近条目的平均值,就像在一维数组上取滑动平均值一样。最干净的方法是什么?

【问题讨论】:

你如何定义“n个最近的条目”?这是一个以当前条目为中心的正方形区域(例如 5x5)吗? @PeterGibson 这可以正常工作——该区域的确切形状对我的用例来说并不重要。 【参考方案1】:

这与将过滤器应用于图像的概念类似。

幸运的是,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 选项控制边缘的处理方式。您没有指定要如何处理边缘。在此示例中,“常量”模式意味着它将数组边界之外的每个项目视为常量值 0(0 是默认值,可以覆盖)。

【讨论】:

谢谢,但链接的文档有点稀疏。如果我的图像被称为 img 并且我想计算每个像素周围 5x5 网格的平均值,我将使用的确切调用是什么? 不能为每个轴指定不同的mode 真是太可惜了。或者,等等,我想那是行不通的。

以上是关于Numpy 二维移动平均线的主要内容,如果未能解决你的问题,请参考以下文章

NumPy 版本的“指数加权移动平均线”,相当于 pandas.ewm().mean()

如何使用 python + NumPy / SciPy 计算滚动/移动平均值?

MATLAB 在 NumPy/Python 中的平滑实现(n 点移动平均)

二维数组的 Numpy 元素平均计算

具有不同切片的二维 numpy 数组的平均值

numpy数据平滑