在python中找到两个本地最小值

时间:2018-04-21 17:03:03

标签: 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值范围的通用代码。

2 个答案:

答案 0 :(得分:3)

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

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指出这一点

答案 1 :(得分:0)

我建议使用scipy.signal.argrelmin来查找所有本地最小值,而不是循环遍历数组。你可以选择最喜欢的两个。

<?php
$mailto = $_POST['mail_to'];
$mailSub = $_POST['mail_sub'];
$mailMsg = $_POST['mail_msg'];
require 'PHPMailer-master/PHPMailerAutoload.php';

$mail = new PHPMailer();
$mail ->IsSmtp();
$mail ->SMTPDebug = 2;
$mail ->SMTPAuth = true;
$mail ->SMTPSecure = 'ssl';
$mail ->Host = "smtp.gmail.com";
$mail ->Port = 465; /* or 587;*/
$mail ->IsHTML(true);
$mail ->Username = "xxxxx";
$mail ->Password = "xxxxx";
$mail ->SetFrom("xxxxx");
$mail ->Subject = $mailSub;
$mail ->Body = $mailMsg; 
$mail ->AddAddress($mailto);

if(!$mail->Send())
{
    echo "Mail Not Sent";
}
else
{
    echo "Mail Sent";
}

?>

这会输出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不会将数组的开头和结尾识别为局部最小值的候选者。 (对“局部最小值”有不同的解释:一个允许端点,另一个不允许。)如果你希望在函数达到最小值时包含端点,那就这样做:

argrelmin(t, mode=‘wrap’)

现在输出为if t[0] < t[1]: relmin = np.append(relmin, 0) if t[-1] < t[-2]: relmin = np.append(relmin, len(t)-1)