Minima: Find the 3 most extreme local minima of a 2D surface
Input Format
The surface is given as a square matrix (n by n).
A minima is a value that is smaller than all its neighbors.
Arguments:
n: int, the order of the array
m: a 2D array (list of lists) of floats
Constraints:
n < 50
Sample Input
n = 5
m = [[5.,5.,5.,5.,5.],
[5.,1.,5.,5.,5.],
[5.,5.,5.,4.,5.],
[5.,5.,4.,2.,3.],
[0.,5.,5.,3.,4.]]
Output Format
An array (list) of floats, sorted ascending, of the minima values.
Return a max of 3 values. If none are found, return an empty array (list).
Sample Output
[0.,1.,2.]
import numpy as np
import scipy.ndimage.filters as filters
import scipy.ndimage.morphology as morphology
defdetect_local_minima(arr):# https://stackoverflow.com/questions/3684484/peak-detection-in-a-2d-array/3689710#3689710"""
Takes an array and detects the troughs using the local maximum filter.
Returns a boolean mask of the troughs (i.e. 1 when
the pixel's value is the neighborhood maximum, 0 otherwise)
"""# define an connected neighborhood# http://www.scipy.org/doc/api_docs/SciPy.ndimage.morphology.html#generate_binary_structure
neighborhood = morphology.generate_binary_structure(len(arr.shape),2)# apply the local minimum filter; all locations of minimum value# in their neighborhood are set to 1# http://www.scipy.org/doc/api_docs/SciPy.ndimage.filters.html#minimum_filter
local_min =(filters.minimum_filter(arr, footprint = neighborhood)== arr)# local_min is a mask that contains the peaks we are# looking for, but also the background.# In order to isolate the peaks we must remove the background from the mask.## we create the mask of the background
background =(arr==0)## a little technicality: we must erode the background in order to# successfully subtract it from local_min, otherwise a line will# appear along the background border (artifact of the local minimum filter)# http://www.scipy.org/doc/api_docs/SciPy.ndimage.morphology.html#binary_erosion
eroded_background = morphology.binary_erosion(background, structure = neighborhood, border_value =1)## we obtain the final mask, containing only peaks,# by removing the background from the local_min mask
detected_minima = local_min ^ eroded_background
return np.where(detected_minima)
arr=np.array([[[0,0,0,-1],[0,0,0,0],[0,0,0,0],[0,0,0,0],[-1,0,0,0]],[[0,0,0,0],[0,-1,0,0],[0,0,0,0],[0,0,0,-1],[0,0,0,0]]])
local_minima_locations = detect_local_minima(arr)print(arr)# [[[ 0 0 0 -1]# [ 0 0 0 0]# [ 0 0 0 0]# [ 0 0 0 0]# [-1 0 0 0]]# [[ 0 0 0 0]# [ 0 -1 0 0]# [ 0 0 0 0]# [ 0 0 0 -1]# [ 0 0 0 0]]]print(local_minima_locations)# (array([0, 0, 1, 1]), array([0, 4, 1, 3]), array([3, 0, 1, 3]))print(arr[local_minima_locations])# [-1 -1 -1 -1]
Minima: Find the 3 most extreme local minima of a 2D surfaceInput FormatThe surface is given as a square matrix (n by n). A minima is a value that is smaller than all its neighbors.Arguments: ...