-4

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

4

2 回答 2

0

写完问题后用谷歌搜索发现了称为 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.] 
于 2019-12-18T13:45:38.463 回答
0

这是最短的:

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'))

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

有用的链接:

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

提高代码效率:滑动窗口的标准差

于 2019-12-19T06:53:42.220 回答