在一个一维numpy数组中使用Numpy寻找局部最大值/最小值。

15 浏览
0 Comments

在一个一维numpy数组中使用Numpy寻找局部最大值/最小值。

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

0
0 Comments

问题的出现原因:在使用Numpy处理一维数组时,需要找到局部最大值/最小值,但是Numpy库本身并没有提供直接的函数来实现这个功能。

解决方法:可以使用SciPy库中的find_peaks函数来找到局部最大值。在SciPy版本1.1及以上,可以通过设置height参数来选择高于某个阈值的所有最大值。如果要找到最小值,只需将输入乘以-1即可。此外,还可以使用distance参数来定义两个峰值之间的最小距离。

文章如下:

在使用Numpy处理一维数组时,有时候需要找到数组中的局部最大值或最小值。然而,Numpy库本身并没有提供直接的函数来实现这个功能。幸运的是,在SciPy库中有一个非常有用的函数,可以帮助我们找到这些局部极值点。

从SciPy 1.1版本开始,我们可以使用find_peaks函数来找到局部最大值。下面是两个示例,取自SciPy文档本身。第一个示例演示了如何使用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参数的用法,它定义了两个峰值之间的最小距离。通过设置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()

有人提出了一个问题,即通过将输入乘以-1来找到最小值是否是推荐的方法。对此,有人回答说这是一个相当标准的方法。在优化问题中,当你试图最大化一个目标函数时,可以将其乘以-1,然后使用最小化方法来解决问题。

通过使用SciPy库中的find_peaks函数,我们可以方便地找到一维数组中的局部最大值。通过设置height参数和distance参数,我们可以选择符合特定条件的最大值。当然,对于最小值,我们可以通过将输入乘以-1来实现。这种方法在优化问题中也经常被使用。

0
0 Comments

在这段内容中,问题是如何找到一个一维numpy数组中的局部最大/最小值,而解决方法是使用numpy中的函数。具体来说,可以尝试使用以下代码来找到小于其相邻元素的所有条目:numpy.r_[True, a[1:] < a[:-1]] & numpy.r_[a[:-1] < a[1:], True]。另一种方法是在此步骤之前使用numpy.convolve()对数组进行平滑处理。然而,由于不同的使用情况对于"局部最小值"的概念有不同的理解,因此很难为此目的提供一个"标准"函数。平滑处理有助于考虑到更多的邻居元素。使用其他整数而不是1,比如3,将只考虑第三个邻居元素,而不是直接的邻居。为了考虑到n个邻居元素,可以将代码修改为:min(x) = min(x[i - n] : x[i + n])。虽然有一种使用Scipy的解决方案,但对于较大的数据集,这种方法似乎更快。为了找到局部最大值而不是最小值,可以将"<"替换为">"。如果在使用上述解决方案时遇到问题,可能是因为'a'不是numpy数组,而是python列表。可以尝试将其转换为numpy数组,即'a = np.array(a)'。如果想要添加一个阈值,可以在代码末尾附加& numpy.r_[a[:] < threshold]。

0
0 Comments

在SciPy >= 0.11中,可以使用argrelextrema函数在一维numpy数组中找到局部最大值/最小值。该函数的作用是返回数组中满足指定比较条件的元素的索引。

使用argrelextrema函数可以找到数组x中的局部最大值和最小值。具体代码如下:

import numpy as np
from scipy.signal import argrelextrema
x = np.random.random(12)
# 寻找局部最大值
argrelextrema(x, np.greater)
# 寻找局部最小值
argrelextrema(x, np.less)

上述代码中,argrelextrema(x, np.greater)返回的是数组x中满足大于相邻元素的元素的索引,argrelextrema(x, np.less)返回的是数组x中满足小于相邻元素的元素的索引。

需要注意的是,argrelextrema函数返回的是索引值,如果要获取对应的数值,可以使用以下代码:

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

另外,scipy.signal模块还提供了argrelmax和argrelmin函数,用于寻找最大值和最小值。

接下来讨论一些与argrelextrema函数相关的问题。首先是代码中的`np.random.random(12)`,这个函数生成了一个包含12个随机值的数组,它们用于演示argrelextrema函数的用法。

另一个问题是,如果输入的数组是`test02=np.array([10,4,4,4,5,6,7,6])`,则argrelextrema函数无法正确识别连续的局部最小值。这种情况下,可以使用find_peaks函数来寻找最大值或最小值。

还有一些其他问题,比如如何处理数组的极值点,即第一个元素和最后一个元素,以及函数是否返回连续的局部最小值的数量。对于这些问题,在这个问题的答案中有提供了解决方案。

argrelextrema函数是在一维numpy数组中寻找局部最大值和最小值的有用工具,可以通过传递不同的比较函数来实现不同的功能。使用这个函数可以方便地找到数组中的局部极值点。

0