你能推荐一个能在一维numpy数组中找到局部最大值/最小值的numpy/scipy中的模块函数吗?显然,最简单的方法是看看最近的邻居,但我希望有一个可以接受的解决方案,这是numpy发行版的一部分。
发布于 2011-01-07 19:41:35
如果要在一维数组a
中查找比其相邻项小的所有条目,可以尝试
numpy.r_[True, a[1:] < a[:-1]] & numpy.r_[a[:-1] < a[1:], True]
您还可以在此步骤之前使用numpy.convolve()
smooth您的阵列。
我不认为有专门的函数来做这件事。
发布于 2012-11-21 19:03:51
在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
还提供了argrelmax
和argrelmin
,分别用于查找最大值和最小值。
发布于 2018-11-22 05:07:07
从SciPy版本1.1开始,您还可以使用find_peaks。下面是取自文档本身的两个示例。
使用height
参数,可以选择超过某个阈值的所有最大值(在本例中,选择所有非负最大值;如果必须处理噪声基线,这将非常有用;如果您想找到最小值,只需将您的输入乘以-1
):
import matplotlib.pyplot as plt
from scipy.misc import electrocardiogram
from scipy.signal import find_peaks
import numpy as np
x = electrocardiogram()[2000:4000]
peaks, _ = find_peaks(x, height=0)
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.plot(np.zeros_like(x), "--", color="gray")
plt.show()
另一个非常有用的参数是distance
,它定义了两个峰之间的最小距离:
peaks, _ = find_peaks(x, distance=150)
# difference between peaks is >= 150
print(np.diff(peaks))
# prints [186 180 177 171 177 169 167 164 158 162 172]
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.show()
https://stackoverflow.com/questions/4624970
复制相似问题