首页 > 解决方案 > 从一维numpy数组中获取相对极值

问题描述

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

一开始,我用argrelextremascipy.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]也被视为局部最大值,并且包含值 2 in b[7]。通过使用第三个,我可以扔掉b[7]. 但是order=2当数据像这样时仍然存在问题[1, 3, 1, 4, 1](它无法捕获3)

我的预期结果是

[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找到局部最小值的功能?

标签: pythonnumpyscipy

解决方案


您可以简单地应用于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)

推荐阅读