从一维numpy数组获取相对极值

时间:2019-01-27 09:37:17

标签: python numpy scipy

我正在编写代码,其中包含用于在数组中查找局部最大值/最小值的算法。但是我找不到合适的功能。

起初,我在argrelextrema中使用了scipy.signal

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]。但是当数据像order=2(无法捕获3)时,[1, 3, 1, 4, 1]仍然存在问题

我的预期结果是

[3(or 4), 9, 14(or 15), 20]

我只想在b[3], b[4]中捕获一个(相同值)。我希望解决上面提到的argrelextrema的一些问题。下面的代码成功。

scipy.signal.find_peaks(b)

结果是[3, 9, 14, 20]

我正在编写的代码正在处理一对局部最大值和局部最小值。所以我想以同样的方式找到局部最小值。是否有类似scipy.signal.find_peaks的函数来查找局部最小值?

1 个答案:

答案 0 :(得分:3)

您可以简单地将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)