| 
 
	积分3625贡献 精华在线时间 小时注册时间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()
 
 
 
 
 | 
 |