¿Cómo encontrar FWHM en un conjunto de datos con varios picos?

Estoy usando un script de Python que encuentra los índices de los picos (o valles en mi caso) a lo largo de un perfil 1D, en un rango específico de valores. Mi objective es medir el FWHM para cada valle de interés. Este es un ejemplo de perfil 1D.

Este es el guión:

def detect_peaks (x, mnph=None, mxph=None, mpd=1, threshold=0, edge='rising', kpsh=False, valley=False, show=False, ax=None): #from __future__ import division, print_function import numpy as np x = np.atleast_1d(x).astype('float64') if x.size < 3: return np.array([], dtype=int) if valley: x = -x # find indices of all peaks dx = x[1:] - x[:-1] # handle NaN's indnan = np.where(np.isnan(x))[0] if indnan.size: x[indnan] = np.inf dx[np.where(np.isnan(dx))[0]] = np.inf ine, ire, ife = np.array([[], [], []], dtype=int) if not edge: ine = np.where((np.hstack((dx, 0))  0))[0] else: if edge.lower() in ['rising', 'both']: ire = np.where((np.hstack((dx, 0))  0))[0] if edge.lower() in ['falling', 'both']: ife = np.where((np.hstack((dx, 0)) = 0))[0] ind = np.unique(np.hstack((ine, ire, ife))) # handle NaN's if ind.size and indnan.size: # NaN's and values close to NaN's cannot be peaks ind = ind[np.in1d(ind, np.unique(np.hstack((indnan, indnan-1, indnan+1))), invert=True)] # first and last values of x cannot be peaks if ind.size and ind[0] == 0: ind = ind[1:] if ind.size and ind[-1] == x.size-1: ind = ind[:-1] """ABOUT mnph and mxph => It works just on valleys, for peaks: REMOVE the minus ("-") below in the code""" # remove valleys = mnph] # remove valleys > maximum peak height if ind.size and mxph is not None: ind = ind[-x[ind] <= mxph] return ind 

¿Cómo puedo realizar esta operación?

Puedes hacer esto usando un modelo de mezcla gaussiana . No creo que haya una función en SciPy, pero hay una en scikit-learn

Aquí hay un tutorial sobre esto.