在 python 中找到两个局部最小值



我有一个t值的列表。我查找最小值的代码如下;

for i in np.arange(0,499,1):
    if t[i]<t[i-1] and t[i]<t[i+1] :                       
        t_min.append(t[i])

我的 t 值每次都会更改,因此可能会在开头或结尾发生最小值之一,在这种情况下,此代码将不起作用。所以我需要一个适用于任何范围的 t 值的通用代码。

您可以使用 % 运算符在末尾循环,并在迭代器的长度上添加一个。这会将您的数组"视为一个圆",这才是您真正想要的。

t_min = []
for i in range(len(t)):
    if  t[i] < min(t[i - 1], t[(i + 1) % len(t)]):
        t_min.append(t[i])

编辑:修复我取的值范围,以便第一个元素不会被检查两次,这要归功于@Jasper指出这一点

与其遍历数组,我建议使用 scipy.signal.argrelmin 来查找所有局部最小值。你可以从中挑选两个你最喜欢的。

from scipy.signal import argrelmin
import numpy as np
t = np.sin(np.linspace(0, 4*np.pi, 500))
relmin = argrelmin(t)[0]
print(relmin)

这将输出[187 437] .

要将数组视为环绕数组,请使用argrelmin(t, mode=‘wrap’)


如果没有环绕,argrelmin 不会将数组的开头和结尾识别为局部最小值的候选者。(对"本地最小值"有不同的解释:一种允许端点,另一种不允许。如果您希望在函数达到最小值时包含端点,请执行以下操作:

if t[0] < t[1]:
    relmin = np.append(relmin, 0)
if t[-1] < t[-2]:
    relmin = np.append(relmin, len(t)-1)

现在输出是 [187 437 0] .

最新更新