File size: 1,056 Bytes
aa651cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
from scipy.signal import argrelextrema

def find_extrema(x, y):
    # Find the indices of the local maxima and minima
    maxima_idx = argrelextrema(x, np.greater)[0]
    minima_idx = argrelextrema(x, np.less)[0]

    # Get the x and y values at the extrema
    maxima_x = x[maxima_idx]
    maxima_y = y[maxima_idx]
    minima_x = x[minima_idx]
    minima_y = y[minima_idx]

    # Combine the maxima and minima into a single array
    extrema_x = np.concatenate((maxima_x, minima_x))
    extrema_y = np.concatenate((maxima_y, minima_y))

    # Determine whether each extrema is a maximum or minimum
    is_maxima = np.zeros(len(extrema_x), dtype=bool)
    is_maxima[:len(maxima_x)] = True

    # Sort the extrema by x-value
    idx = np.argsort(extrema_x)
    extrema_x = extrema_x[idx]
    extrema_y = extrema_y[idx]
    is_maxima = is_maxima[idx]

    # Convert the boolean array to a list of strings
    extrema_type = ["arrow-left" if is_max else "arrow-right" for is_max in is_maxima]

    return extrema_x, extrema_y, extrema_type