我有一个看起来像这样的数据集(一维 python 列表):
[0,0,0,0,4,5,6,6,4,0,0,0,0,0,0,2,0,0,0,6,4,5,6,0,0,0,0,0]
我正在尝试根据上一个窗口找到变化的截止点。
我正在寻找以下输出:
[4, 9, 19, 23]
假设我的窗口需要至少为 3,变化必须至少发生 3 个连续元素和数据中的一些噪声,我想出了:
- 用至少 2 个元素填充窗口
- 计算标准偏差,将 stddev 内的所有后续点添加到该窗口。每次添加新点时重新计算。
- 当一个点在 stddev 之外(例如这里的第一次出现 4),确保下一个点也在 stddev 之外(第一次出现 5),如果是这样,则在第一个异常点上附加一个新索引( 4 这里)。如果不继续添加到当前窗口。
- 新的“偏差”值成为比较的窗口,重复。
有没有更好的方法来做到这一点,或者内置的 numpy 函数来帮忙?
谢谢。
编辑
@qwwqwwq 提出的解决方案效果很好,但我还有一个小限制 - 我意识到我的列表值没有相同的权重。假设这个新数据集:
[(10, 0), (20, 0), (15, 0), (20, 0), (8, 4), (10, 5), (15, 6), (15, 6), (10, 4), (5, 0),(5, 0), (20, 0), (10, 0), (8, 0),(5, 0), (10, 2), (5, 0), (5, 0), (5,0), (10,6) ,(5, 4), (5,5), (10, 6), (10, 0),(10,0) ,(10,0) ,(10,0) ,(10,0)]
- 其中 pos 0 是以秒为单位的持续时间
- pos 1 是我的价值
- 考虑峰值的最短时间是 30 秒
widths = np.array([2]
我怎么能用我的最短时间代替?
我知道我可以采取slope_down_begin_points
,检查最接近的slope_down_begin_points
,看看两者之间的点持续时间之和是否>最小时间。我不是很熟悉signal
,希望有更好的东西吗?
编辑 2
另一种更简单、更天真的方法是将 >0 的值组合在一起,并将 [0] 和 [-1] 值作为边缘切片。
for k, g in groupby(x, key=lambda v: v[1] == 0):
print k,g
group = list(g)
# only consider if long enough
if sum([z[0] for z in group]) > some_minumum_time:
# do stuff