from numpy import *
# example data with some peaks:
x = linspace(0,4,1e3)
data = .2*sin(10*x)+ exp(-abs(2-x)**2)
# that's the line, you need:
a = diff(sign(diff(data))).nonzero()[0] + 1 # local min+max
b = (diff(sign(diff(data))) > 0).nonzero()[0] + 1 # local min
c = (diff(sign(diff(data))) < 0).nonzero()[0] + 1 # local max
# graphical output...
from pylab import *
plot(x,data)
plot(x[b], data[b], "o", label="min")
plot(x[c], data[c], "o", label="max")
legend()
show()
import numpy as np
from scipy.signal import argrelextrema
x = np.random.random(12)
# for local maxima
argrelextrema(x, np.greater)
# for local minima
argrelextrema(x, np.less)
如果要查找1d数组中小于其邻居的所有项,可以尝试
在此步骤之前,还可以使用
numpy.convolve()
来smooth数组。我不认为有专门的功能。
对于没有太多噪声的曲线,我建议使用以下小代码段:
+1
很重要,因为diff
减少了原始索引号。在SciPy中>;=0.11
产生
注意,这些是x的索引,是本地最大/最小值。若要获取这些值,请尝试:
scipy.signal
还提供argrelmax
和argrelmin
分别用于查找最大值和最小值。相关问题 更多 >
编程相关推荐