Python - 拟合二维矩形数据

3
我正在使用Python 2.7编写程序,但我很难找到插值/拟合矩形数据的最佳方法。
我的数据是已知的坐标点格式为z=f(x,y),其中x和y均匀地分布在网格上。我的x值从0到100以0.1的间隔变化。我的y值从0到100以2的间隔变化。
我的问题在于如何对这些数据进行插值或拟合,因为我的y数据坐标之间的间距很大。我正在寻找最佳方法来拟合这些数据,以便我可以评估任何(X,Y)坐标对的高度Z。我希望得到的曲面尽可能光滑。传统方法使用griddata或rectbivariatespline不能生成光滑的曲面-似乎是因为我的y坐标点之间的距离比x坐标点之间的距离要大得多。
我考虑的一个选项是使用polyfit(或类似的东西)将多项式拟合到每个切片(每个X处的Y vs Z曲线),然后将这些切片插值在一起以产生更平滑的曲面。这似乎是一种迂回的方式。这是最好的选择吗?
如果对多项式进行拟合,那么我的每个切片(固定X的Y vs Z)大致上是高斯或双峰的。它们是相当简单的分布。
我的目标是能够生成平滑的曲面,以在3D或pcolor样式图中显示。我需要避免超出Zmax和Zmin。我知道使用样条时会出现这个问题。
从我所了解的内容来看,似乎我要找的是Python中一个用于2D数据的形状保持插值方法。我需要类似于matlab中的pchip,但适用于曲面。我查看了所有文档,并找不到任何形状保持的内容能够给出光滑的曲面。谢谢您提供的任何帮助。我会仔细观察此线程并快速回复,如果您需要任何解释。

我离开了我的桌子,但我确信有正则化样条插值方法。也许值得研究一下。 - YXD
你尝试过使用map_coordinates吗? - tiago
2个回答

2
“传统方法使用griddata或rectbivariatespline无法产生平滑的表面——似乎是因为我的y点之间的距离比x点之间的距离大得多。”您应该尝试适当缩放y坐标——至少griddata假设欧几里德度量,即所有维度的长度尺度相似。另一方面,如果您想要形状保持插值,请参见我的回答here。然而,这种插值不会进行任何平滑处理,所以也许这并不是您真正想要的。

谢谢您提供保持形状的解决方案。我将尝试在今天下午实现它。当您说pchip方法不会进行任何平滑处理时,它仍然会产生比线性插值更平滑的曲面,对吗?因为峰值将是圆形而不是锯齿状的点?这是我从阅读以下内容中得出的结论: http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Interpolating_a_data_set - user1764386
是的,如果我没记错的话,它将产生一个具有连续导数的曲面,但仍会穿过所有数据点。 - pv.

0

你可以尝试我的基于BSD许可的numpy和scipy的曲线和曲面拟合库,它位于Google Code存储库中:

http://code.google.com/p/pyeq2/downloads/list

它有很多例子,包括用于性能的Python并行编程。由于它是免费的,尝试它不会花费任何费用。

詹姆斯


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