gpt4 book ai didi

python - python列表上的变量滑动窗口

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:59 24 4
gpt4 key购买 nike

我有一个如下所示的数据集(1D 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

最佳答案

我能想到的解决这个问题的最佳方法是对数组拟合样条曲线,求导数,然后找到所有局部最大值。这些局部最大值应该代表峰值的边界,我认为这就是您所追求的。我的做法:

from scipy import signal
from scipy import interpolate
import numpy as np
from numpy import linspace

x = [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]
s = interpolate.UnivariateSpline( linspace(0,len(x)-1,len(x)), np.array(x) )
ds = s.derivative()

slope_down_begin_points = [ p for p in signal.find_peaks_cwt( vector = [ -ds(v) for v in range(len(x)) ], widths = np.array([2]) ) if x[p-1] >= 1 ]

slope_up_begin_points = [ p for p in signal.find_peaks_cwt( vector = [ ds(v) for v in range(len(x)) ], widths = np.array([2]) ) if x[p+1] >= 1 ]

slope_up_begin_points + slope_down_begin_points
>> [4, 9, 16, 19, 23]

16 包含在此方法中,因为它本身就是一个小微峰,如果您摆弄 find_peaks_cwt/UnivariateSpline您应该能够将其过滤掉的参数..

关于python - python列表上的变量滑动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com