【问题标题】:Problems trying to calculate FWHM with scipy.interpolate尝试使用 scipy.interpolate 计算 FWHM 的问题
【发布时间】:2014-08-14 02:55:35
【问题描述】:

我在尝试查找某些数据的 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):

有什么想法吗?谢谢。

【问题讨论】:

    标签: python image-processing scipy interpolation spline


    【解决方案1】:

    使用UnivariateSpline.roots() 获取 FWHM 仅在您移动数据使其值在 FWHM 处为 0 时才有效。

    看到数据的背景是嘈杂的,我首先估计了基线。例如:

    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 参数。

    【讨论】:

    • 感谢您的回复。这是我尝试过的,但我仍然没有找到根源:x = np.linspace(0, line.shape[0], line.shape[0], False) x = map(int, x) y_baseline = y[(x&lt;200) &amp; (x&gt;350)].mean() y_shifted = y - (y.min() + y_baseline)/2.0 curve = interpolate.UnivariateSpline(x, y_shifted, s=0) r = curve.roots() print(r) 我仍然得到一个空列表。曲线向下移动到零以下。
    • 没关系,min 函数与 numpy 有冲突,无法正常工作。我修好了它,现在我正在扎根。感谢您的帮助!
    猜你喜欢
    • 2018-08-12
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2023-02-15
    • 2013-04-30
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多