【问题标题】:Python - Interpolating between lines of dataPython - 在数据行之间进行插值
【发布时间】:2026-01-22 23:45:01
【问题描述】:

我有一个以点 (x,Y,Z) 为特征的二维网格上的数据。 X 和 Y 值表示每个点的位置,Z 是每个点的“高度”或“强度”。

我的问题是我沿 X 轴的数据坐标间隔非常紧密(约 1000 点),而我的 Y 坐标分散开(约 50 点)。这意味着,当绘制在散点图上时,我基本上有数据行,相邻行之间的空白空间数量相等。

我的数据在散点图上的间隔示例:

ooooooooooooooooooooooooooooooo


ooooooooooooooooooooooooooooooo


ooooooooooooooooooooooooooooooo

我想对这些点进行插值以获得连续曲面。我希望能够评估此表面上任何位置的“高度”。我已经尝试过每一种 scipy 插值方法,但不确定最“智能”的方法是什么。我应该插入每个垂直数据切片,然后将它们拼接在一起吗?

我希望表面尽可能光滑,但需要保持形状的方法。我不希望任何插值曲面超出我的输入数据。

您能提供的任何帮助都会非常有帮助。

编辑:

当我更多地考虑这个问题时,似乎插值垂直切片然后将它们拼接在一起是行不通的。这将导致沿垂直切片的值仅受该切片的影响,这不会导致表面不准确吗?

【问题讨论】:

  • “过冲”是什么意思?
  • 你解决过这个问题吗?

标签: python numpy matplotlib scipy


【解决方案1】:

我推荐这个tutorial。它的核心是(从链接中提取):

>>> grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]
>>> from scipy.interpolate import griddata
>>> grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
>>> grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
>>> grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')

这将为您提供三种不同级别的数据插值(doc)

【讨论】:

  • 感谢您的链接。这实际上是我已经实施的众多方法之一。三次不存在问题,因为它超出了输入数据。线性插值似乎不太适合,但它是一种选择。
  • 您是否还查看了该页面下方的样条拟合?我发现一维样条对于嘈杂的数据非常有效。您能否完全平滑您的数据(这将有助于解决由数据的二阶导数波动引起的超调)。
【解决方案2】:

如果您正在寻找表面,我的假设是您可以通过使用垂直切片,然后绘制填充数据来获得。

【讨论】: