python / scipy中的多元样条插值?

     2023-02-16     238

关键词:

【中文标题】python / scipy中的多元样条插值?【英文标题】:Multivariate spline interpolation in python/scipy? 【发布时间】:2011-09-08 10:58:03 【问题描述】:

是否有库模块或其他直接的方法可以在 python 中实现多元样条插值?

具体来说,我在规则间隔的 3 维网格上有一组标量数据,我需要在散布在整个域中的少量点处进行插值。对于二维数据,我一直在使用scipy.interpolate.RectBivariateSpline,我实际上是在寻找将其扩展到三维数据的方法。

我发现的 N 维插值例程不够好:我更喜欢样条曲线而不是 LinearNDInterpolator 以获得平滑度,而且我有太多数据点(通常超过一百万)用于例如径向基础功能正常工作。

如果有人知道可以执行此操作的 python 库,或者我可以调用或移植的另一种语言的库,我将不胜感激。

【问题讨论】:

只是为了确保我理解正确,您的数据已经在规则网格上并且您想在不规则点进行插值? (如果是这样,你想要 scipy.ndimage.map_coordinates,我稍后会发布一个示例......) 【参考方案1】:

如果我正确理解了您的问题,您输入的“观察”数据会定期网格化吗?

如果是这样,scipy.ndimage.map_coordinates 正是您想要的。

在第一次通过时有点难以理解,但本质上,您只需为其提供一系列坐标,您希望在像素/体素/n 维索引坐标中插入网格值。

作为 2D 示例:

import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt

# Note that the output interpolated coords will be the same dtype as your input
# data.  If we have an array of ints, and we want floating point precision in
# the output interpolated points, we need to cast the array as floats
data = np.arange(40).reshape((8,5)).astype(np.float)

# I'm writing these as row, column pairs for clarity...
coords = np.array([[1.2, 3.5], [6.7, 2.5], [7.9, 3.5], [3.5, 3.5]])
# However, map_coordinates expects the transpose of this
coords = coords.T

# The "mode" kwarg here just controls how the boundaries are treated
# mode='nearest' is _not_ nearest neighbor interpolation, it just uses the
# value of the nearest cell if the point lies outside the grid.  The default is
# to treat the values outside the grid as zero, which can cause some edge
# effects if you're interpolating points near the edge
# The "order" kwarg controls the order of the splines used. The default is 
# cubic splines, order=3
zi = ndimage.map_coordinates(data, coords, order=3, mode='nearest')

row, column = coords
nrows, ncols = data.shape
im = plt.imshow(data, interpolation='nearest', extent=[0, ncols, nrows, 0])
plt.colorbar(im)
plt.scatter(column, row, c=zi, vmin=data.min(), vmax=data.max())
for r, c, z in zip(row, column, zi):
    plt.annotate('%0.3f' % z, (c,r), xytext=(-10,10), textcoords='offset points',
            arrowprops=dict(arrowstyle='->'), ha='right')
plt.show()

要在 n 维中做到这一点,我们只需要传入适当大小的数组:

import numpy as np
from scipy import ndimage

data = np.arange(3*5*9).reshape((3,5,9)).astype(np.float)
coords = np.array([[1.2, 3.5, 7.8], [0.5, 0.5, 6.8]])
zi = ndimage.map_coordinates(data, coords.T)

就缩放和内存使用而言,map_coordinates 将在您使用 > 1 的阶数(即非线性插值)时创建数组的过滤副本。如果您只想在极少数点进行插值,这是一个相当大的开销。但是,它不会随着您要插值的点数而增加。只要有足够的 RAM 用于输入数据数组的单个临时副本,就可以了。

如果您无法在内存中存储数据副本,您可以 a) 指定 prefilter=Falseorder=1 并使用线性插值,或者 b) 使用 ndimage.spline_filter 将原始数据替换为过滤版本,然后使用prefilter=False 调用map_coordinates。

即使您有足够的内存,如果您需要多次调用 map_coordinates(例如交互式使用等),保留过滤后的数据集可能会大大加快速度。

【讨论】:

对于非结构化 3D 数据 (asked here)987654322@?【参考方案2】:

dim > 2 中的平滑样条插值很难实现,因此能够做到这一点的免费库并不多(事实上,我不知道)。

您可以尝试反距离加权插值,请参阅:Inverse Distance Weighted (IDW) Interpolation with Python。 这应该会产生相当平滑的结果,并且比 RBF 更好地扩展到更大的数据集。

【讨论】:

IDW 在几乎所有情况下都是一个可怕的选择。它假定您的所有输入数据点都是局部最小值或最大值!我不确定人们是否将它用作一般插值技术......(当然很多人都这样做!)除非你特别想要在你的观察点周围出现“靶心”图案,否则这不是你想要的。 /rant 无论如何,我认为 OP 定期对数据进行网格化,他们希望在这些数据处进行点插值,而不是对不规则点进行插值。在这种情况下有更好的选择。 顺便说一句,我不是故意这么粗鲁的……我只是对 IDW 作为一种插值方法有仇视! :) @Joe Kington,(在您无数的好答案和 cmets 中错过了这一点):您建议用什么方法在 2d、5d、10d 中插值分散/非均匀数据?在 2d / 3d 中可以进行三角测量,但在 10d 中? @Denis - 谢谢 :) 径向基函数可能很慢,但它们很平滑并且可以很好地扩展到高维。只要您不只使用 N 个最近的点进行优化,您就根本不需要担心三角测量。唯一的参数是距离,与维度无关。无论如何,希望对您有所帮助。 @Joe Kington,嗨乔!感谢所有python指导!我在这里遇到了与 OP 相同的问题,并想知道以下最佳选择:(1) scipy.interpolate.interpn、(2) scipy.interpolate.RegularGridInterpolator 和 (3) scipy.ndimage.interpolation.map_coordinates .这些方法中的任何一个是否等效,在幕后可能相同,或者在速度、内存和/或准确性方面具有任何特殊优势?

数值分析中的样条函数:使用scipy.interpolate.splrep函数实现

...x和y相同。权重用于计算加权最小二乘样条拟合。如果y值中的误差具有矢量d给出的标准偏差,则w应 查看详情

scipy之数据插值详解(代码片段)

...f0c;scipy中插值主要分为以下几种类型:1维的数据插值多元的数据插值样条插值使用径向基函数进行平滑的插值1维的数据插值在 查看详情

scipy之数据插值详解(代码片段)

...f0c;scipy中插值主要分为以下几种类型:1维的数据插值多元的数据插值样条插值使用径向基函数进行平滑的插值1维的数据插值在 查看详情

Python - 使用样条线插值二维点云

】Python-使用样条线插值二维点云【英文标题】:Python-Interpolate2Dpointcloudusingsplines【发布时间】:2020-08-2509:55:05【问题描述】:我正在尝试拟合2D点云(x和y坐标)。到目前为止,我在scipy的插值包方面取得了有限的成功,最值得... 查看详情

在python/numpy/scipy中找到两个数组之间的插值交集(代码片段)

我正在寻找一种简单的方法来找到两个Numpy数组之间的插值交集。我知道如果我们有两个函数句柄而不是两个数组,就可以实现这一点,如使用Scipy或使用Sympy在this链接中所示。我想做同样的事情,但是给出了两个数组,特别是... 查看详情

用于 SciPy 集成和插值的 Numba

...主要时间(大约90%)是在scipyquad积分和插值(线性和三次样条)中。我做了几百次这些集成,所以我认为这是Numba可以提升的东西。看起来Numb 查看详情

气象python二维线性插值

参考技术Ascipy.interpolate.griddata(points,values,xi,method=\'linear\',fill_value=nan,rescale=False)官网:https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html?highlight=griddata一维数组,shape为(n,),是需要插值的变量数据如果需要插值... 查看详情

Python/Scipy 2D 插值(非均匀数据)

】Python/Scipy2D插值(非均匀数据)【英文标题】:Python/Scipy2DInterpolation(Non-uniformData)【发布时间】:2011-07-0523:38:55【问题描述】:这是我之前帖子的后续问题:Python/ScipyInterpolation(map_coordinates)假设我想在二维矩形区域上进行插值... 查看详情

使用 Python 进行 B 样条插值

】使用Python进行B样条插值【英文标题】:B-splineinterpolationwithPython【发布时间】:2014-08-2801:20:00【问题描述】:我正在尝试使用Python重现B样条的Mathematica示例。mathematica示例代码如下pts=0,0,0,2,2,3,4,0,6,3,8,2,8,0;Graphics[BSplineCurve[pts,Spli... 查看详情

Numpy / Scipy中的快速线性插值“沿路径”

】Numpy/Scipy中的快速线性插值“沿路径”【英文标题】:FastlinearinterpolationinNumpy/Scipy"alongapath"【发布时间】:2016-01-0905:42:54【问题描述】:假设我有来自山上3个(已知)高度的气象站的数据。具体来说,每个站点每分钟... 查看详情

C ++中的三次样条插值

】C++中的三次样条插值【英文标题】:CubicSplineInterpolationinC++【发布时间】:2010-02-0707:36:35【问题描述】:我正在使用OpenCV在C++中进行图像处理。我有一个需要对一组数据进行三次插值的问题。我可以在OpenCV中使用任何库文件吗... 查看详情

python使用sklearn-contrib-py-earth包构建多元自适应回归样条回归模型(multivariateadaptiveregressionsplines,mars)

Python使用sklearn-contrib-py-earth包构建多元自适应回归样条回归模型(MultivariateAdaptiveRegressionSplines,MARS)目录Python使用sklearn-contrib-py-earth包构建多元自适应回归 查看详情

差异 scipy interpolate vs mpl griddata

...来,真的希望有人能在这里帮助我。我需要将一个脚本从python2转换为python3,它是一个简单的脚本,它接受坐标点x、y,以及这些点的值z。z在网格上插值,然后绘制。python2脚本中的插值目前正 查看详情

python数学建模系列:数值逼近(代码片段)

文章目录前言往期文章1.一维插值​1.1线性插值与样条插值(B-spline)1.2高阶样条插值2.二维插值2.1图像模糊处理——样条插值2.2二维插值的三维图3.最小二乘拟合结语前言Hello!小伙伴!非常感谢您阅读海轰的文章,倘若... 查看详情

三次样条插值法(代码片段)

文章目录一、分段插值1、三次样条插值一、分段插值1、三次样条插值三(二)次样条插值就是在任意两点之间插入用三(二)次函数连接,且点的连接处的导数相同。根据过点和点处导数相同可以联立方程求... 查看详情

插值:用于生成空间分布图

1、反距离函数和样条函数都属于精确性插值,插值表面均通过采样点。在采样点微小邻域,两者的插值结果比较接近。2、反距离函数和样条函数插值受采样点的密度影响较大。在采样点分布比较密集的区域,插值结果差异较小... 查看详情

样条之拉格朗日lagrange(一元全区间)插值函数[转](代码片段)

...律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到 查看详情

三次样条插值介绍

所谓三次样条插值对于一个区间(a,b)将区间分成x0=a<x1......xn-1<b=xn的n-1个区间,我们需要通过已知的n+1个点来模拟一个未知的函数,在三次样条插值中我们采用分段的方法来做这件事情。三次样条插值得到的分段函数保证... 查看详情