我在尝试查找某些数据的 FWHM 时遇到问题。我最初尝试使用 interpolate.interp1d 来拟合曲线。有了这个,我就能够创建一个函数,当我输入 x 值时,它将返回插值的 y 值。问题是我需要这个功能的逆功能。换句话说,我想切换自变量和因变量。当我尝试切换它们时,我收到错误,因为必须对独立数据进行排序。如果我对数据进行排序,我将丢失索引,从而丢失图表的形状。
我尝试过:
x = np.linspace(0, line.shape[0], line.shape[0])
self.x_curve = interpolate.interp1d(x, y, 'linear')
其中 y
是我的数据。
为了得到逆,我尝试了:
self.x_curve = interpolate.interp1d(sorted(y), x, 'linear')
但值已关闭。
然后我继续尝试使用 UnivariateSpline 并获取根来查找 FWHM(来自此问题: Finding the full width half maximum of a peak ),但 root() 方法始终给我一个空列表 []
.
这是我使用的:
x_curve = interpolate.UnivariateSpline(x, y)
r = x_curve.roots()
print(r)
这是数据图像(使用 UnivariateSpline):
有什么想法吗?谢谢。
最佳答案
仅当您移动数据使其在 FWHM 处的值为 0 时,使用 UnivariateSpline.roots()
获取 FWHM 才有效。
由于数据背景有噪声,我首先估计基线。例如:
y_baseline = y[(x<200) & (x>350)].mean()
(根据需要调整 x
的限制)。然后移动数据,使基线和峰值的中间位于 0。看到您的数据有最小值而不是最大值,如示例中所示,我使用 y.min()
:
y_shifted = y - (y.min()+y_baseline)/2.0
现在将样条曲线拟合到这个移位的数据上,roots()
应该能够找到根,其差异就是 FWHM。
x_curve = interpolate.UnivariateSpline(x, y_shifted, s=0)
x_curve.roots()
如果您想根据平滑数据估计 FWHM,请增加 s
参数。
关于python - 尝试使用 scipy.interpolate 计算 FWHM 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24376574/