Эта задача (при условии, что я правильно понял вопрос и, как отметил Джеймс Филлипс в своем комментарии) довольно проста. Однако есть несколько способов добиться этого. Вот один из них:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
def decay( x, a, b, c ):
return a + b * np.exp( - c * x )
xList = np.linspace( 0, 5, 121 )
yList = np.fromiter( ( .6 * np.exp( -( x - 2.25 )**2 / .05 ) + decay( x, .3, 1, .6) + .05 * np.random.normal() for x in xList ), np.float )
takeList = np.concatenate( np.argwhere( np.logical_or(xList < 2., xList > 2.5) ) )
featureList = np.concatenate( np.argwhere( np.logical_and(xList >= 2., xList <= 2.5) ) )
xSubList = xList[ takeList ]
ySubList = yList[ takeList ]
xFtList = xList[ featureList ]
yFtList = yList[ featureList ]
myFit, _ = curve_fit( decay, xSubList, ySubList )
fitList = np.fromiter( ( decay( x, *myFit) for x in xList ), np.float )
cleanY = np.fromiter( ( y - decay( x, *myFit) for x,y in zip( xList, yList ) ), np.float )
fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.plot( xList, yList )
ax.plot( xSubList, ySubList - .1, '--' ) ## -0.1 offset for visibility
ax.plot( xFtList, yFtList + .1, ':' ) ## +0.1 offset for visibility
ax.plot( xList, fitList, '-.' )
ax.plot( xList, cleanY ) ## feature without background
plt.show()