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

标签 python numpy scipy

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

首先,我在 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)

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

我正在编写的代码正在处理局部最大值和局部最小值对。所以我想以同样的方式找到局部最小值。是否有类似 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)

关于python - 从一维 numpy 数组中获取相对极值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54386781/

相关文章:

python - 对多列进行分组,然后追加

python - 如何分配属于不同人群的不确定性?

python - fmin_l_bfgs_b 返回 NaN 作为函数值,但我不明白

python - A = Bᵀ·B 的稀疏矩阵分解

python - 如何使用 FFT 卷积执行形态侵 eclipse

python - 迭代 numpy 数组

python - % 在 Ipython 中的库前签名

python - 从数组中随机选择正负数据

python - 如何使用 openCV python 更改现有视频的帧速率 FPS

python - 如何将numpy数组转换为元组