【问题标题】:Interval average of 1D data一维数据的区间平均值
【发布时间】:2013-05-24 11:00:24
【问题描述】:

我有两个一维数组,一个用于测量数据,另一个用于位置。例如,测量的数据可以是温度,另一个数组是测量的高度:

temp = np.asarray([10, 9.6, 9.3, ..., -20.3, -21.0])  # Temperature in celsius
height = np.asarray([129, 145, 167, ..., 5043, 5112]) # Height in meters

如您所见,测量的高度不是规则间隔的。

我想以规则间隔的高度间隔计算平均温度。这是某种移动平均线,但窗口大小是可变的,因为感兴趣区间内的数据点并不总是相同。

这可以通过以下方式使用 for 循环来完成:

regular_heights = np.arange(0, 6000, 100) # Regular heights every 100m
regular_temps = []

for i in range(len(regular_heights)-1):
    mask = np.logical_and(height > regular_heights[i], height < regular_heights[i+1])
    mean = np.mean(temp[mask])
    regular_temps.append(mean)

regular_temps = np.hstack((regular_temps))

我不太喜欢这种方法,我想知道是否会有更“numpy 风格”的解决方案。

【问题讨论】:

  • 您想要“移动平均线”还是“定期间隔的平均温度”?也就是说,如果你有 N 个区间,你想要 N 个平均值,还是你想要一个使用移动窗口(跨越每个位置的高度范围)的连续平均值?
  • 正如我在我的commnet 中对@elyase 的回答所说的那样,我可能需要首先以规则间隔的方式计算平均值,然后用样条曲线对其进行平滑处理。但是,移动平均线与样条曲线结合起来也可能很好。

标签: python numpy average


【解决方案1】:

您可能正在寻找UnivariateSpline。例如:

from scipy.interpolate import UnivariateSpline

temp = np.asarray([10, 9.6, 9.3, 9.0, 8.7])    # Temperature in celsius
height = np.asarray([129, 145, 167, 190, 213]) # Height in meters
f = UnivariateSpline(height, temp)

现在您可以在任何地方评估f

regular_heights = np.arange(120, 213, 5)       # Regular heights every 5m
plot(height, temp, 'o', regular_heights, f(regular_heights), 'x')

【讨论】:

  • f(regular_heights) 在这些点给出插值。不是 OP 所要求的——高度区间内的值的平均值。
  • 我知道他提到了“意思”,但是用一种相当模糊的方式(意思是什么?)。看起来这就是他真正想要的,这就是为什么我说'可能在寻找......'。如果你愿意,你可以发布一个带有平均值的答案,我想我们最终会找出他所追求的。
  • UnivariateSpline对于在垂直剖面中获取的数据看起来很好,但是,在我的情况下,数据是在不同的位置同时获取的,值非常不同。也许我的解决方案需要结合使用这两种方法,首先是平均以获得规则间隔的数据集,然后应用样条曲线以获得平滑曲线。
  • 我不知道你的数据到底是什么样的,但你可能想看看这个:scikit-learn.org/0.13/modules/gaussian_process.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2016-11-06
相关资源
最近更新 更多