45 lines
865 B
Python
45 lines
865 B
Python
|
def find_maxima(x):
|
||
|
"""Find local maxima of x.
|
||
|
|
||
|
Example:
|
||
|
>>> x = [1, 3, -2, 0, 2, 1]
|
||
|
>>> find_maxima(x)
|
||
|
[1, 4]
|
||
|
|
||
|
If in a local maximum several elements have the same value,
|
||
|
return the left-most index.
|
||
|
Example:
|
||
|
>>> x = [1, 2, 2, 1]
|
||
|
>>> find_maxima(x)
|
||
|
[1]
|
||
|
|
||
|
Input arguments:
|
||
|
x -- 1D list of real numbers
|
||
|
|
||
|
Output:
|
||
|
idx -- list of indices of the local maxima in x
|
||
|
"""
|
||
|
|
||
|
idx = []
|
||
|
up = False
|
||
|
down = False
|
||
|
for i in range(len(x)):
|
||
|
if i == 0 or x[i-1] < x[i]:
|
||
|
up = True
|
||
|
up_idx = i
|
||
|
elif x[i-1] > x[i]:
|
||
|
up = False
|
||
|
|
||
|
# if x[i-1] == x[i], no change
|
||
|
|
||
|
if i+1 == len(x) or x[i+1] < x[i]:
|
||
|
down = True
|
||
|
elif x[i+1] > x[i]:
|
||
|
down = False
|
||
|
|
||
|
if up and down:
|
||
|
idx.append(up_idx)
|
||
|
|
||
|
return idx
|
||
|
|