首页 > 解决方案 > 在python中计算运行中位数的最短方法是什么?

问题描述

我需要在 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函数也可以。

标签: pythonnumpymathmedianscipy.ndimage

解决方案


写完问题后用谷歌搜索发现了称为 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.] 

推荐阅读