+2 votes

There are functions in **scipy.signal** module that can be used to find local minima and maxima in an array/matrix.

Function argrelmin() is used to calculate the relative minima of data. Similarly, argrelmax() is used to calculate the relative maxima of data. These functions return the indices of local minima/maxima in the data. The indices can be used to find the values of local minima/maxima.

The following example shows how to use these functions. I am also plotting the data so that the local minima/maxima can be verified visually.

import numpy as np

from scipy.signal import argrelmin, argrelmax

import matplotlib.pyplot as plt

# generate random data

np.random.seed(7)

y = np.random.random_sample(25)

x = np.asarray([i+1 for i in range(25)])

# find local minima and maximamin_idx = argrelmin(y)

print("Indices of minima: {0}".format(min_idx))

print("Minima: {0}".format(y[min_idx]))max_idx = argrelmax(y)

print("Indices of maxima: {0}".format(max_idx))

print("Maxima: {0}".format(y[max_idx]))

# plot data

plt.plot(x, y, 'g-o')

plt.savefig("plots/local_minima_maxima.png")

The above code prints the following output:

*Indices of minima: (array([ 2, 7, 13, 16, 19, 22]),)Minima: [0.43840923 0.07205113 0.06593635 0.21338535 0.02489923 0.23030288]Indices of maxima: (array([ 1, 4, 11, 15, 18, 21]),)Maxima: [0.77991879 0.97798951 0.80373904 0.90959353 0.93120602 0.9501295 ]*

It generates the following plot. You can verify the results by looking at the plot.