- 积分
- 3638
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
'''
需求缘起:
工作中,常需要从一个时间序列里找出几处高峰,分析为什么高。
用眼睛看、脑子想,是比较费眼、费脑、费时、费力的事,
于是我想用程序自动找,
以下函数用于从一个序列中找出[n1,n2]个峰值的位置
'''
# x是一个一维序列
def findFewPeak(x):
n=len(x) # 序列元素数量
n1=3 #至少需要的峰值数量
n2=5 #最多需要的峰值数量
# 通过调整步长,获得合适数量的峰值:
# 一般,步长越长,峰值越少
for step in range(1,n,1):
peak_pos=[] # 峰值位置
for i in range(step,n-step,1):
zone=x[i-step:i+step+1]
if x[i]==max(zone):
peak_pos.append(i)
# 如果此次循环得到的数量合适,就返回:
if len(peak_pos)>=n1 and len(peak_pos)<=n2:
return peak_pos
# 如果最终没找到,返回值就是默认的None,一般都是有的,因为监测曲线都会有振动!
if __name__=="__main__":
import numpy as np
import matplotlib.pyplot as plt
# 一个1000个元素的泊松分布随机数序列:
x=np.random.poisson(5.0,(1000,))
n=len(x)
# 找出合适数量的峰值位置:
peak_pos=findFewPeak(x)
# 画图显示效果:
plt.figure(figsize=(10,3),dpi=100)
plt.plot(range(n),x)
plt.scatter(peak_pos,x[peak_pos],c='red',s=50)
plt.show()
|
|