python插值(scipy.interpolate模块的griddata和Rbf)

python插值(scipy.interpolate模块的griddata和Rbf)1.插值scipy.interpolateSciPy的interpolate模块提供了许多对数据进行插值运算的函数,范围涵盖简单的一维插值到复杂多维插值求解。一维插值:当样本数据变化归因于一个独立的变量时;多维插值:反之样本数据归因于多个独立变量时。注:一维插值这里就不再讲述了,主要是对二维插值的一个总结。2.interp2d()fromscipy.interpolateimportinterp2dinterp2d(x,y,z,kind=’linear’)这里有几个注意事项:

大家好,又见面了,我是你们的朋友全栈君。

1.插值scipy.interpolate

SciPy的interpolate模块提供了许多对数据进行插值运算的函数,范围涵盖简单的一维插值到复杂多维插值求解。

  1. 一维插值:当样本数据变化归因于一个独立的变量时;
  2. 多维插值:反之样本数据归因于多个独立变量时。

注:一维插值这里就不再讲述了,主要是对二维插值的一个总结。

2.interp2d()

from scipy.interpolate import interp2d
interp2d(x,y,z,kind='linear')

这里有几个注意事项:

  1. interp2d()中,输入的x,y,z先用ravel()被转成了一维数组
  2. func()的输入必须是一维的,输出是二维的(有点奇怪,感觉完成度不高)
  3. 插值的源数据必须是等距网格。不然的haul,运行不保存但结果不对。

3.Rbf()

Rbf的优点是,排列可以无序,可以不是等距的网格。

  1. 随机生成点,并计算函数值
  2. 插值(输入输出都是二维
from scipy.interpolate import Rbf
func = Rbf(x, y, z, function='linear')  # 插值
z_new = func(x1, y1)
x,y,z实际的数据,都是一维数组
function为插值方法,有‘linear’,‘cubic’等
x1,y1为网格数据,z_new为插值后的数据,都是二维的

由于我们必须将 2d 点作为形状为 (N, 2) 的数组传递,因此我们必须展平输入网格并堆叠两个展平的阵列。 构造的插值器也需要这种格式的查询点,结果将是一个形状为 (N,) 的一维数组,我们必须重新整形以匹配我们的二维网格以进行绘图。 由于 Rbf 不对输入点的维数做任何假设,因此它支持插值的任意维数。
所以,scipy.interpolate.Rbf

  1. 即使对于疯狂的输入数据也能产生良好的输出
  2. 支持更高维度的插值
  3. 在输入点的凸包外外推(当然外推总是一场赌博,您通常根本不应该依赖它)
  4. 创建一个插值器作为第一步,因此在不同的输出点对其进行评估会减少额外的工作量
  5. 可以有任意形状的输出点数组(与被限制为矩形网格相反,见下文)
  6. 更有可能保持输入数据的对称性
  7. 支持关键字核的多种径向函数:multiquadric、inverse_multiquadric、inverse_quadratic、gaussian、linear、cubic、quintic、thin_plate_spline(默认)。从 SciPy 1.7.0 开始,由于技术原因,该类不允许传递自定义可调用项,但这可能会在未来版本中添加。
  8. 可以通过增加平滑参数给出不精确的插值

4. griddata()

from scipy.interpolate import griddata
griddata(points,values,xi,method =‘linear’,fill_value = nan,rescale = False

参数:

points:数据点坐标。可以是形状(n,D)的数组,也可以是ndim数组的元组。(已知点)
values:浮点或复数的ndarray,形状(n,)的数据值。(已知点对应的值)
xi : 浮点数的二维数组或一维数组的元组,形状(M,D)插值数据的点。(被划分后的网格)
method:‘linear’,‘nearest’,‘cubic’,可选其中的插值方法之一。(插值方式)
{ 
   
nearest 返回最接近插值点的数据点的值。
linear 将输入点设置为n维单纯形,并在每个单形上线性插值。
cubic (1-d) 返回由三次样条确定的值。
cubic (2-d) 返回由分段立方,连续可微(C1)和近似曲率最小化多项式表面确定的值。
}
fill_value : float,可选。用于填充输入点凸包外部的请求点的值。如果未提供,则默认为nan。此选项对“最近”方法无效。

rescale : bool,可选。在执行插值之前,重新缩放指向单位立方体。如果某些输入维度具有不可比较的单位并且相差很多个数量级,则这非常有用。

5.二维插值griddata和Rbf对比

注:不考虑内存,CPU,只针对相当小的数据集,主要考虑插值的质量。

  1. griddata基于提供的点的Delaunay三角部分。然后将数据插值到每个单元(三角形)上。例如,对于2D函数和线性插值,三角形内部的值是经过三个相邻点的平面。
  2. rbf通过为每个提供的点分配一个径向函数来工作。“径向”表示该功能仅取决于到该点的距离。任何点的值都是通过所有提供的点的加权贡献之和得出的。只要定义了距离函数,该方法就不管变量空间的大小都适用。

Rbf 内插的一个缺点是内插 N 个数据点涉及对 N x N 矩阵求逆。 这种二次复杂性非常迅速地破坏了大量数据点的内存需求。 但是,新的 RBFInterpolator 类还支持邻居关键字参数,该参数将每个径向基函数的计算限制为 k 个最近的邻居,从而减少内存需求。

z_dense_smooth_griddata = interp.griddata((x_sparse.ravel(), y_sparse.ravel()),
                                          z_sparse_smooth.ravel(), (x_dense, y_dense), method='cubic')

输出点数组可以指定为任意维度数组的元组(如上述两个片段),这为我们提供了更大的灵活性。
简而言之,scipy.interpolate.griddata

  1. 即使对于疯狂的输入数据也能产生良好的输出
  2. 支持更高维度的插值
  3. 不执行外推,可以为输入点凸包外的输出设置单个值(参见fill_value)
  4. 在单个调用中计算内插值,因此从头开始探测多组输出点
  5. 可以有任意形状的输出点
  6. 支持任意维度的最近邻和线性插值,1d 和 2d 中的三次。最近邻和线性插值分别在引擎盖下使用 NearestNDInterpolator 和 LinearNDInterpolator。 1d 三次插值使用样条,2d 三次插值使用 CloughTocher2DInterpolator 构造一个连续可微的分段三次插值器。
  7. 可能违反输入数据的对称性

6.插值举例

站点数据插值:地图网格插值

  1. 取经纬度:lon,lat (经纬度数组,n)

  2. 取站点的观测数据集:data  (这个数据维度与站点数量同,即1*n)

  3. 准备两个列表用于构造网格矩阵:
    olon = np.linspace(108,115,97)
    olat = np.linspace(24,31,97)

  4. 构造网格矩阵
    olon,olat = np.meshgrid(olon,olat)

  5. 做插值:(需要到入Rbf函数:from scipy.interpolate import Rbf
    func = Rbf(lon,lat,data,function=‘linear‘)
    rain_data_new = func(olon,olat)

  6. 或griddata插值
    rain_data_new = griddata((lon,lat), data, (olon,olat), method='linear')

注:由于Rbf插值要求矩阵可逆,所以在经纬度列表时,不能有相同的两行。

参考:
Python+matplotlib+scipy站点数据绘制气象分布图(示例代码)
https://stackoverflow.com/questions/37872171/how-can-i-perform-two-dimensional-interpolation-using-scipy

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141556.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月25日 下午5:00
下一篇 2022年5月25日 下午5:00


相关推荐

  • 孙鑫老师 java从入门到精通 视频教程 批量下载

    孙鑫老师 java从入门到精通 视频教程 批量下载本视频教程是孙鑫老师亲自开发录制的,内容涵盖了java技术从入门到精通整个过程。对于java爱好者是一套不可多得的教材!相信下载此教程的同志都是未来的电脑高手,对于批量下载的方法我在这时就不一一说了,相信兄弟们都能找到这种简单规律。这里以第三课批量下载为例简单说一下:(记得将通配符长度设为1哦)第一课Java的一些基本概念http://www.ibook8.com/te

    2022年5月17日
    45
  • 基于Tensorflow + yolo3的安全帽识别系统[通俗易懂]

    基于Tensorflow + yolo3的安全帽识别系统[通俗易懂]最近做了一个新的项目,需要将图片或者视频中的人员是否戴安全帽识别出来,并且在网站上进行显示.首先是正常的登录注册目前登录注册有很多方式,这个比较常规,用户名密码登录,也没有写的很复杂.接下来就是主要功能页面了如上图所示,可以进行图片及视频识别图片上传,正在进行识别…

    2022年5月12日
    55
  • Ubuntu安装redis详细教程

    Ubuntu安装redis详细教程apt 安装本文 Ubuntu 环境 20 04 NoLSBmodules DistributorI UbuntuDescri Ubuntu20 04 1LTSRelease 20 04Codename focal 关于如何更换 Ubuntu 的软件更新源 请看我这篇文章 安装 redissudoapt getinstall yredis server 设置密码 sudovim etc redis redis redis co

    2026年3月17日
    2
  • 在 OpenClaw 中配置本地化部署的大模型

    在 OpenClaw 中配置本地化部署的大模型

    2026年3月13日
    2
  • jsp include与include

    jsp include与includeinclude是翻译是进行合并,然后对合并文件进行编译jsp:include是分别编译,然后对二进制文件合并

    2022年7月13日
    22
  • matlab做kmo检验的代码,急求 KMO测度和Bartlett 的球形度检验的计算原公式[通俗易懂]

    matlab做kmo检验的代码,急求 KMO测度和Bartlett 的球形度检验的计算原公式[通俗易懂]1、关于KMO公式,您从如下matlab源程序代码中不难得出,我已经用Excel就计算出来了,跟SPSS的计算结果完全一致。iX=inv(X);%X是原始数据的相关系数矩阵R,而inv表示求X的逆矩阵iXS2=diag(diag((iX.^-1)));%将iX的对角线的元素取倒数,其余元素都变为0,得到矩阵S2AIS=S2*iX*S2;%anti-image…

    2022年6月29日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号