【问题标题】:What is the shortest way to calculate running median in python?在python中计算运行中位数的最短方法是什么?
【发布时间】:2020-04-11 02:04:21
【问题描述】:

我需要在 python 中计算一个运行中位数。目前我是这样做的:

med_y = []
med_x = []
for i in numpy.arange(240, 380, 1):

    med_y.append(numpy.median(dy[(dx > i)*(dx < i+20)]))
    med_x.append(i + 10)

这里的数据存储在 dx(x 坐标)和 dy(y 坐标)中,中值被 dy 取代并绘制在 dx 上(必须移动 window/2)。假设 x 和窗口大小的均匀间距为 20。

有没有更短的方法?

例如,运行平均可以这样完成:

cs = numpy.cumsum(dy)
y_20 = (cs[20:] - cs[:-20])/20.0
x_20 = dx[10:-10]

在站点包中预定义运行 X 函数也可以。

【问题讨论】:

    标签: python numpy math median scipy.ndimage


    【解决方案1】:

    在写完问题后谷歌搜索显示了一个名为 medfilt 的信号处理函数,例如scipy.signal.medfilt 带有两个输入参数:数字列表和窗口大小。

    在以下情况下有效:

    • 窗口大小不均匀
    • 与边缘的距离超过 (window+1)/2

    在边缘附近,它给出了最小的内部窗口/2。我猜原因是它最初是为了减少图像中的黑色错误像素,而你希望边缘是黑色的。

    例如:

    from scipy.signal import medfilt 
    values = [1,1,1,0,1,1,1,1,1,1,1,2,1,1,1,10,1,1,1,1,1,1,1,1,1,1,0,1]
    print medfilt(values,7)
    

    非常适合 values[4:-4] 并给出 min(values[:4]) 和 min(values[-4:]) 边缘。上面例子的输出是:

    output = [0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.] 
    

    【讨论】:

    • 好的,学习了文档中“零填充”的含义。边缘的行为是由于当窗口超出数据时添加到窗口中的零。
    【解决方案2】:

    这是最短的:

    from scipy.ndimage import median_filter
    values = [1,1,1,0,1,1,1,1,1,1,1,2,1,1,1,10,1,1,1,1,1,1,1,1,1,1,0,1]
    print median_filter(values, 7, mode='mirror')
    

    它在边缘可以正常工作(或者您可以选择它在边缘的工作方式)。

    而任何一般的运行X都是这样完成的(以运行标准差为例):

    import numpy
    from scipy.ndimage.filters import generic_filter
    values = numpy.array([0,1,2,3,4,5,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1]).astype('float')
    print(generic_filter(values, numpy.std, size=7, mode='mirror'))
    

    在上面,float输入类型很重要。

    有用的链接:

    https://nickc1.github.io/python,/matlab/2016/05/17/Standard-Deviation-(Filters)-in-Matlab-and-Python.html

    improving code efficiency: standard deviation on sliding windows

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2010-10-14
      • 2012-08-23
      • 2013-01-23
      • 2011-07-13
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多