从一维numpy数组求相对极值

2024-04-24 06:43:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写代码,其中包括在数组中查找局部最大值/最小值的算法。但是我没有找到合适的函数。你知道吗

起初,我在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]。但是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这样的函数来寻找局部极小值?你知道吗


Tags: or函数代码signalnporder局部scipy
1条回答
网友
1楼 · 发布于 2024-04-24 06:43:11

只需将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)

相关问题 更多 >