python - 在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函数也可以。
解决方案
写完问题后用谷歌搜索发现了称为 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.]
推荐阅读
- javascript - 不用导入 React 就可以使用 JSX
- cluster-analysis - 用于对具有极低方差的数据进行聚类的数据准备
- javascript - 如何显示来自 Chrome 扩展程序的警报但在主浏览器窗口中居中
- clojure - 无法为现有的 Google 日历活动创建 Google 会议
- java - AnonPages 是堆的一部分吗?这些是什么?
- postgresql - 导入 .csv 文件时有没有办法添加额外的序列类型的 id 列?
- asp.net-mvc - 对 api 控制器使用基于 cookie 的身份验证和基于令牌的身份验证
- excel - 在所有工作表VBA中的相同位置获取某些列标题
- vba - 使用 VBA 清理 Word 中的非结构化数据
- python - 我试图开始使用 python 的多处理模块但不工作