首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在1Dnumpy数组中寻找具有Numpy的局部最大值/最小值

在1Dnumpy数组中寻找具有Numpy的局部最大值/最小值
EN

Stack Overflow用户
提问于 2011-01-07 19:22:09
回答 11查看 264.9K关注 0票数 139

你能推荐一个能在一维numpy数组中找到局部最大值/最小值的numpy/scipy中的模块函数吗?显然,最简单的方法是看看最近的邻居,但我希望有一个可以接受的解决方案,这是numpy发行版的一部分。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-01-07 19:41:35

如果要在一维数组a中查找比其相邻项小的所有条目,可以尝试

numpy.r_[True, a[1:] < a[:-1]] & numpy.r_[a[:-1] < a[1:], True]

您还可以在此步骤之前使用numpy.convolve() smooth您的阵列。

我不认为有专门的函数来做这件事。

票数 80
EN

Stack Overflow用户

发布于 2012-11-21 19:03:51

在SciPy >= 0.11中

import numpy as np
from scipy.signal import argrelextrema

x = np.random.random(12)

# for local maxima
argrelextrema(x, np.greater)

# for local minima
argrelextrema(x, np.less)

产生

>>> x
array([ 0.56660112,  0.76309473,  0.69597908,  0.38260156,  0.24346445,
    0.56021785,  0.24109326,  0.41884061,  0.35461957,  0.54398472,
    0.59572658,  0.92377974])
>>> argrelextrema(x, np.greater)
(array([1, 5, 7]),)
>>> argrelextrema(x, np.less)
(array([4, 6, 8]),)

请注意,这些是x的索引,即本地最大值/分钟。要获取这些值,请尝试:

>>> x[argrelextrema(x, np.greater)[0]]

scipy.signal还提供了argrelmaxargrelmin,分别用于查找最大值和最小值。

票数 244
EN

Stack Overflow用户

发布于 2018-11-22 05:07:07

从SciPy版本1.1开始,您还可以使用find_peaks。下面是取自文档本身的两个示例。

使用height参数,可以选择超过某个阈值的所有最大值(在本例中,选择所有非负最大值;如果必须处理噪声基线,这将非常有用;如果您想找到最小值,只需将您的输入乘以-1):

import matplotlib.pyplot as plt
from scipy.misc import electrocardiogram
from scipy.signal import find_peaks
import numpy as np

x = electrocardiogram()[2000:4000]
peaks, _ = find_peaks(x, height=0)
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.plot(np.zeros_like(x), "--", color="gray")
plt.show()

另一个非常有用的参数是distance,它定义了两个峰之间的最小距离:

peaks, _ = find_peaks(x, distance=150)
# difference between peaks is >= 150
print(np.diff(peaks))
# prints [186 180 177 171 177 169 167 164 158 162 172]

plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.show()

票数 53
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4624970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档