doctorwho
doctorwho

Reputation: 13

Find two local minima

I have a list of t values. My code for finding the minima values is as follows;

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])

My t values change every time and hence it may happen that one of the minima occurs at the beginning or end in that case this code would not work. So I need a general code which will work for any range of t values.

Upvotes: 0

Views: 1891

Answers (2)

tanboon
tanboon

Reputation: 71

You can loop around the end using the % operator and adding one to the length of the iterator. This treats your array 'as a circle', which is what you really want.

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])

Edit: Fix the range of values i takes so that the first element isn't checked twice, thanks to @Jasper for pointing this out

Upvotes: 3

user6655984
user6655984

Reputation:

Instead of looping over the array, I suggest using scipy.signal.argrelmin which finds all local minima. You can pick two you like most from those.

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)

This outputs [187 437].

To treat the array as wrapping around, use argrelmin(t, mode=‘wrap’)


Without wrap-around, argrelmin does not recognize the beginning and end of an array as candidates for local minimum. (There are different interpretations of "local minimum": one allows the endpoints, the other does not.) If you want the endpoints to be included when the function achieves minimum there, do it like this:

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

Now the output is [187 437 0].

Upvotes: 0

Related Questions