Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>The location of the local minima can be found for an array of arbitrary dimension using <a href="https://stackoverflow.com/questions/3684484/peak-detection-in-a-2d-array/3689710#3689710">Ivan</a>'s <a href="https://stackoverflow.com/questions/3684484/peak-detection-in-a-2d-array/3689710#3689710">detect_peaks function</a>, with minor modifications:</p> <pre><code>import numpy as np import scipy.ndimage.filters as filters import scipy.ndimage.morphology as morphology def detect_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) </code></pre> <p>which you can use like this:</p> <pre><code>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]]] </code></pre> <p>This says the minima occur at indices [0,0,3], [0,4,0], [1,1,1] and [1,3,3]:</p> <pre><code>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] </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload