1D数据的区间平均值

6

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

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个平均值,还是想要使用移动窗口(跨越每个位置的高度范围)进行连续平均? - tom10
正如我在对@elyase答案的评论中所说,我可能需要首先在定期间隔内计算平均值,然后再使用样条进行平滑处理。然而,移动平均法与样条相结合也可能是一个不错的选择。 - Iñigo Hernáez Corres
1个回答

3

您可能正在寻找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')

enter image description here


1
f(regular_heights)在这些点上给出了插值。这不是OP所要求的——在高度间隔内的值的平均值。 - mg007
我知道他提到了“平均值”,但表述比较模糊(平均值是什么?)。看起来这正是他想要的,这就是为什么我说“可能在寻找...”。如果你愿意,你可以发布一个带有平均值的答案,我猜我们最终会弄清楚他想要什么。 - elyase
UnivariateSpline对于垂直剖面数据看起来很好,但在我的情况下,数据是同时在不同位置采集的,值非常不同。也许我的解决方案需要结合两种方法,首先进行平均处理以获得定期间隔的数据集,然后应用样条曲线以获得平滑曲线。 - Iñigo Hernáez Corres
我不确定你的数据具体是什么样子,但你可能想要查看这个链接:http://scikit-learn.org/0.13/modules/gaussian_process.html - elyase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接