Python 一维数据的阶跃检测

Python 一维数据的阶跃检测,python,signal-processing,Python,Signal Processing,Python中是否有用于检测一维数据中的步骤的现有实现 例如,在该数据中检测到一个步骤的东西: 有很多关于算法的描述,但我想知道Python中是否存在适合这项工作的东西 我不确定是否/如何提供这些数据,但具体如下: [ 594. 568.55555556 577.22222222 624.55555556 546.66666667 552.88888889 575.55555556 592.33333333 528.88888889 576.11111111 6

Python中是否有用于检测一维数据中的步骤的现有实现

例如,在该数据中检测到一个步骤的东西:


有很多关于算法的描述,但我想知道Python中是否存在适合这项工作的东西

我不确定是否/如何提供这些数据,但具体如下:

[ 594.          568.55555556  577.22222222  624.55555556  546.66666667
552.88888889  575.55555556  592.33333333  528.88888889  576.11111111
625.          574.22222222  556.33333333  567.66666667  576.66666667
591.66666667  566.33333333  567.33333333  547.44444444  631.11111111
555.66666667  548.66666667  579.44444444  546.88888889  597.55555556
519.88888889  582.33333333  618.88888889  574.55555556  547.44444444
593.11111111  565.66666667  544.66666667  562.66666667  554.11111111
543.88888889  602.33333333  609.77777778  550.55555556  561.88888889
719.33333333  784.44444444  711.22222222  843.66666667  691.33333333
690.11111111  684.33333333  749.11111111  759.11111111  653.33333333
817.11111111  705.22222222  689.44444444  712.33333333  659.
683.88888889  713.          740.44444444  692.22222222  677.33333333
681.44444444  640.          717.55555556  717.88888889  769.22222222
690.88888889  786.          774.66666667  799.44444444  743.44444444
789.88888889  673.66666667  685.66666667  709.88888889  645.55555556
846.11111111  792.77777778  702.22222222  749.44444444  678.55555556
707.55555556  665.77777778  643.55555556  671.44444444  795.66666667
627.22222222  684.55555556  708.44444444  829.66666667  719.        ]

用步长进行卷积,看看峰值分辨率是否足够好

import numpy as np
from matplotlib import pyplot as plt


d = '''594.          568.55555556  577.22222222  624.55555556  546.66666667
552.88888889  575.55555556  592.33333333  528.88888889  576.11111111
625.          574.22222222  556.33333333  567.66666667  576.66666667
591.66666667  566.33333333  567.33333333  547.44444444  631.11111111
555.66666667  548.66666667  579.44444444  546.88888889  597.55555556
519.88888889  582.33333333  618.88888889  574.55555556  547.44444444
593.11111111  565.66666667  544.66666667  562.66666667  554.11111111
543.88888889  602.33333333  609.77777778  550.55555556  561.88888889
719.33333333  784.44444444  711.22222222  843.66666667  691.33333333
690.11111111  684.33333333  749.11111111  759.11111111  653.33333333
817.11111111  705.22222222  689.44444444  712.33333333  659.
683.88888889  713.          740.44444444  692.22222222  677.33333333
681.44444444  640.          717.55555556  717.88888889  769.22222222
690.88888889  786.          774.66666667  799.44444444  743.44444444
789.88888889  673.66666667  685.66666667  709.88888889  645.55555556
846.11111111  792.77777778  702.22222222  749.44444444  678.55555556
707.55555556  665.77777778  643.55555556  671.44444444  795.66666667
627.22222222  684.55555556  708.44444444  829.66666667  719.        '''

dary = np.array([*map(float, d.split())])

dary -= np.average(dary)

step = np.hstack((np.ones(len(dary)), -1*np.ones(len(dary))))

dary_step = np.convolve(dary, step, mode='valid')

# get the peak of the convolution, its index

step_indx = np.argmax(dary_step)  # yes, cleaner than np.where(dary_step == dary_step.max())[0][0]

# plots

plt.plot(dary)

plt.plot(dary_step/10)

plt.plot((step_indx, step_indx), (dary_step[step_indx]/10, 0), 'r')

这是一个非常有趣的问题,但令人遗憾的是,图书馆的推荐却偏离了主题。尽管如此,我还是向上投票。@errotlinguist我稍微修改了措辞,以便不直接要求模块。希望它不会被取下来!这让我想起最近发布的一个类似问题:“相当多的算法描述”链接到一篇期刊文章,而不是算法本身。您想要的python算法类型可能在和中找到,因为您已经找到了。标记信号处理可能是您自己进行研究的好地方。你需要了解自己的目标。你所问的问题绝非琐碎,正如你所指出的那样,不太适合这样做。这是难以置信的。你知道网上有什么资源或是一本书介绍了这些方法吗?我指的不仅仅是卷积或信号处理方法,而是信号处理在检测异常值、异常和状态变化方面的应用,就像你刚才描述的那样?argmax可能比
np更受欢迎。其中(dary_step==dary_step.max())[0][0]
conolution是EE的主要支柱,我的背景-峰值也可能是负的,这取决于卷积中步长的相对极性-因此,为了更一般,需要更多的案例测试为什么数组
dary
转换为0-均值?你也可以使用
-2*np.cumsum(dary)
而不是
np.convolve(dary,step,mode='valid'))
。快一点。