在python(numpy/scipy)中,如何在嘈杂的数据集中找到峰值的半高宽?

2024-05-20 00:39:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析两条交叉线(如+号)的图像,并提取一条垂直于其中一条线的像素线(一个nx1numpy数组)。这给了我一个浮点值数组(代表颜色),然后我可以绘制。我用matplotlib绘制数据,得到了一堆180到200之间的噪音数据,中间有一个明显的峰值,峰值可以降到100左右。

我需要找到这些数据的一半。我想我需要先过滤噪声,所以我使用了高斯滤波器,它平滑了我的数据,但在顶部仍然不是超平坦的。

  1. 我想知道是否有更好的方法来过滤数据。

  2. 我怎样才能找到这些数据的半高宽?

如果可能的话,我只想使用numpy、scipy和matplotlib。

原始数据如下: Original Data

以下是筛选的数据: Filtered Data


Tags: 数据方法图像matplotlib颜色绘制代表像素
2条回答

我最终没有使用任何过滤器,而是使用原始数据。 我使用的程序是:

  • 找到最小和最大点并计算difference = max(arr_y) - min(arr_y)
  • 找到半最大值(在我的例子中是半最小值)HM = difference / 2
  • 找到距HM最近的数据点:nearest = (np.abs(arr_y - HM)).argmin()
  • 计算了最近点和最小点之间的距离(这给了我HWHM)
  • 然后简单乘以2得到半高宽

我不知道(或认为)这是最好的方法,但它的工作,似乎是相当准确的比较。

你的脚本已经进行了正确的计算。

但是,当取nearest_abovenearest_below之间的距离时,可以减少nearestpos_extremum之间距离的误差,即两边极值(最大值/最小值)的一半位置。

import numpy as np

# Example data
arr_x = np.linspace(norm.ppf(0.00001), norm.ppf(0.99999), 10000)
arr_y = norm.pdf(arr_x)

# Effective code
difference = max(arr_y) - min(arr_y)
HM = difference / 2

pos_extremum = arr_y.argmax()  # or in your case: arr_y.argmin()

nearest_above = (np.abs(arr_y[pos_extremum:-1] - HM)).argmin()
nearest_below = (np.abs(arr_y[0:pos_extremum] - HM)).argmin()

FWHM = (np.mean(arr_x[nearest_above + pos_extremum]) - 
        np.mean(arr_x[nearest_below]))

在这个例子中,你应该得到FWHM和标准差之间的关系: FWHM = 2.355乘以Wikipedia中提到的标准偏差(这里是1)。

相关问题 更多 >