Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Numpy数组中查找平台_Python_Numpy_Signals - Fatal编程技术网

Python 在Numpy数组中查找平台

Python 在Numpy数组中查找平台,python,numpy,signals,Python,Numpy,Signals,我正在寻找一种有效的方法来检测高原在其他非常嘈杂的数据。高原总是相对较宽,这是一个简单的例子,说明了这些数据可能是什么样子: test=np.random.uniform(0.9,1,100) test[10:20]=0 plt.plot(test) 请注意,可能存在多个具有不同值的平台(应全部检测到) 我尝试使用scipy.signal.argrelextrema,但它似乎没有达到我想要的效果: peaks=argrelextrema(test,np.less,order=25) plt.

我正在寻找一种有效的方法来检测高原在其他非常嘈杂的数据。高原总是相对较宽,这是一个简单的例子,说明了这些数据可能是什么样子:

test=np.random.uniform(0.9,1,100)
test[10:20]=0
plt.plot(test)

请注意,可能存在多个具有不同值的平台(应全部检测到)

我尝试使用scipy.signal.argrelextrema,但它似乎没有达到我想要的效果:

peaks=argrelextrema(test,np.less,order=25)
plt.vlines(peaks,ymin=0, ymax=1)

我不需要平台的精确间隔-粗略的范围估计就足够了,只要该估计大于或等于实际的平台范围。但是,它应该相对有效。

这实际上只是一个“愚蠢”的机器学习任务。您需要编写一个自定义函数来筛选它们。高原有两个关键特征:

  • 它们是相同值的连续出现(或非常接近)
  • 第一个点和最后一个点分别与前向移动平均线和后向移动平均线严重偏离。(如果您期望附加噪声,请尝试基于标准偏差对其进行量化,对于几何噪声,您还必须考虑信号的幅度。)
  • 然后,一个简单的循环应该足以计算前向移动平均线、前向移动平均线中的点的stdev、反向移动平均线和反向移动平均线中的点的stdev

    • 阅读,直到你发现一个点远远超出正常的噪音(比较方差)。开始将这些索引缓冲到列表中
    • 当指数具有相同的值时,继续读取并缓冲该列表中的指数(或者几乎相同,如果你的高原可能有点粗糙;你需要使用一些公差加上高原的标准偏差,或者如果你希望它们都表现类似,则只使用一些公差)
    • 如果缓冲区中的点的方差太大,则不是平台,而是太粗糙;扔掉它,从当前位置再次开始扫描
    • 如果最后一个值与前一个值非常不同(在触发代码开始缓冲索引的更改顺序上),并且与原始脉冲方向相反,请在此处设置缓冲区上限;你有一个高原
    • 现在,对这些索引处的点执行任何操作。删除它们,用两个边界点之间的线性插值替换它们,不管怎样
    我可以生成一些噪声并给您一些示例代码,但这确实是您必须适应应用程序的东西。(例如,这种方法有一个缺点,即在“悬崖边缘”中间捕获一个点的平台在移除其余平台时可能会离开该点。如果这是您担心的问题,您必须在确定平台后进行更多的探索。)您应该能够在一次传递数据的过程中完成这项工作,但最好先获取整个集合的一些统计信息,以便智能地调整阈值


    如果你对平台的构成有一个确切的定义,你可以让它看起来不那么像手的波动和ML,但只要你试图识别模糊模式,你就必须采取基于统计的方法。

    有一种方法
    scipy.signal。找到你可以尝试的\u peaks
    ,这里是一个例子

    导入numpy
    从scipy.signal导入查找\u峰值
    测试=numpy.随机.均匀(0.9,1.0100)
    测试[10:20]=0
    峰值,峰值\u平台=查找峰值(-test,plateau\u size=1)
    
    虽然
    find_peaks
    仅查找峰值,但如果数组被求反,则可以使用它查找谷值,然后执行以下操作

    适用于范围内的i(len(峰值高原['plateau\u大小]):
    如果峰值高原['高原大小][i]>1:
    打印('找到大小为%d的平台'%peak\u plateaus['plateau\u sizes'][i])
    打印('其左索引为%d,右索引为%d%'(峰值平台['左边缘][i],峰值平台['右边缘][i]))
    
    它会打印出来

    发现大小为10的平台
    它的左指数是10,右指数是19
    
    是否存在多个平台?高原是否始终为零?如果它们是零值,您需要的不仅仅是通过
    np获取零值的索引。其中(test==0)
    ?嘿,谢谢您提出的好问题。是的,可以有多个平台;否,平台可以有不同的值。将这一点添加到问题中。是否有一个中间值(如y=0.5)可靠地将低组值与高组值分开?