我正在编写代码,其中包括在数组中查找局部最大值/最小值的算法。但我没能找到合适的函数。
起初,我在scipy.signal
中使用了argrelextrema
。
b = [6, 1, 3, 5, 5, 3, 1, 2, 2, 3, 2, 1, 1, 9, 10, 10, 9, 8, 7, 7, 13, 10]
scipy.signal.argrelextrema(np.array(b), np.greater)
scipy.signal.argrelextrema(np.array(b), np.greater_equal)
scipy.signal.argrelextrema(np.array(b), np.greater_equal, order=2)
结果是
(array([ 9, 20], dtype=int64),)
(array([ 0, 3, 4, 7, 9, 14, 15, 20], dtype=int64),)
(array([ 0, 3, 4, 9, 14, 15, 20], dtype=int64),)
第一个没有捕捉到b[3]
(或b[4]
)。所以我用np.greater_equal
把它修改成了第二个。然而,在这种情况下,第一值b[0]
也被视为局部最大值,并且b[7]
中的值2被包括在内。通过使用第三个,我可以扔掉b[7]
。但当数据类似[1, 3, 1, 4, 1]
时,order=2
仍然存在问题(它无法捕获3)
我的预期结果是
[3(or 4), 9, 14(or 15), 20]
我只想在b[3], b[4]
(相同值)中捕获一个。我想解决我上面提到的argrelextrema
的一些问题。下面的代码成功。
scipy.signal.find_peaks(b)
结果是CCD_ 13。
我正在编写的代码是处理局部最大值和局部最小值这对。所以我想用同样的方法找到局部最小值。有没有像scipy.signal.find_peaks
这样的函数可以找到局部最小值?
您可以简单地将find_peaks
应用于数组的负版本:
from scipy.signal import find_peaks
min_idx = find_peaks([-x for x in b])
使用numpy数组时更方便:
import numpy as np
b = np.array(b)
min_idx = find_peaks(-b)