使用Numpy在1D的numpy数组中寻找本地最大值/最小值

2024-04-25 19:43:23 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

如果要查找1d数组中小于其邻居的所有项,可以尝试

numpy.r_[True, a[1:] < a[:-1]] & numpy.r_[a[:-1] < a[1:], True]

在此步骤之前,还可以使用numpy.convolve()smooth数组。

我不认为有专门的功能。

对于没有太多噪声的曲线,我建议使用以下小代码段:

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()

+1很重要,因为diff减少了原始索引号。

在SciPy中>;=0.11

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)

产生

>>> x
array([ 0.56660112,  0.76309473,  0.69597908,  0.38260156,  0.24346445,
    0.56021785,  0.24109326,  0.41884061,  0.35461957,  0.54398472,
    0.59572658,  0.92377974])
>>> argrelextrema(x, np.greater)
(array([1, 5, 7]),)
>>> argrelextrema(x, np.less)
(array([4, 6, 8]),)

注意,这些是x的索引,是本地最大/最小值。若要获取这些值,请尝试:

>>> x[argrelextrema(x, np.greater)[0]]

scipy.signal还提供argrelmaxargrelmin分别用于查找最大值和最小值。

相关问题 更多 >