python - 从一维numpy数组中获取相对极值
问题描述
我正在编写包含在数组中查找局部最大值/最小值的算法的代码。但我没能找到合适的功能。
一开始,我用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]
也被视为局部最大值,并且包含值 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
找到局部最小值的功能?
解决方案
您可以简单地应用于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)
推荐阅读
- java - 如何使用枚举类将整数值声明为常量?
- php - 为什么即使在脚本中有 http_response_code(500) 时 php 代码也会给出响应代码 200?
- git - 为什么“git describe”的输出从一个版本到另一个版本不同?
- dialogflow-es - 我们如何在内联代码编辑器中配置上下文和事件
- javascript - Cycle.js:自定义驱动程序未在 main() 内发出任何事件
- php - 修改集合中的laravel表名仅用于输出
- android - 未打开主应用程序时,WorkManager Worker 中的 Webview 未加载
- swift - 如何在 Xcode 中拥有良好的项目代码组织?
- python - 运行 buildozer 时错误 13 权限被拒绝
- php - 谷歌日历 API - PHP