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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • IntelliJ IDEA 创建Java项目[通俗易懂]

    IntelliJ IDEA 创建Java项目[通俗易懂]Java模块让你可以开发JavaSE和JavaEE应用程序。由Java模块提供的核心功能可通过加入各种技术和框架支持进行扩展。当您创建好一个项目后,您可以创建一个Java模块。您还可以添加一个Java模块到现有项目。注意:这里说的Java模块实际是一个Java项目,而IDEA的项目(Project)则相当于Eclipse的工作空间(workspace)的概念,相当于VS的解决方案(soluti

  • Java手机游戏开发专辑「建议收藏」

    Java手机游戏开发专辑「建议收藏」Java手机游戏开发专辑  关键字 KXML MMAPI HTTP XML CLDC   移动动作游戏开发中的一些问题  即使目前最新型号的手机仍然不是最理想的游戏平台,但它已经是个良好的开端。处理器、内存和色彩深度提供了游戏开发所需的因素。开发者正努力把其它游戏平台上的质量标准运用到这个平台上。当然了,一些问题仍然存在,然而这些问题终将被解决,就象PC平台游戏开发者使用不断改进的Di

  • ANT安装(亲测可用)「建议收藏」

    ANT安装(亲测可用)「建议收藏」ANT在win10x64系统上进行安装,安装步骤如下。1、打开官网2、选择要下载版本3、配置环境变量在path里配置ant安装地址\binant安装地址\lib4、在cmd里验证:Linux上安装ANT:1、下载apache-ant-1.10.5-bin.tar.gz到home目录2、cpapache-ant-1.10.5-bin.tar.gz/usr/local3、cd/usr/local4、tar-zxvfapache-ant-1.10.5-bin.ta

  • @transactional的使用_@transactional注解默认的回滚方式

    @transactional的使用_@transactional注解默认的回滚方式@Transactional是声明式事务管理编程中使用的注解1.添加位置1)接口实现类或接口实现方法上,而不是接口类中。2)访问权限:public的方法才起作用。@Transactional注解应该只被应用到public方法上,这是由SpringAOP的本质决定的。系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管…

  • “0x69ba3a96〞指令引用的〝0x00000000〞内存。该内存不能为〝written〞[通俗易懂]

    —转自sql1981(http://zhidao.baidu.com/question/385499006.html&__bd_tkn__=729142612d22862b5053a77a93ad20fd864f93af8078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157b54f836

  • 如何正确安装Oracle:Oracle11g安装教程

    如何正确安装Oracle:Oracle11g安装教程前言之前安装的过程中存在隐患问题,所以导致了我把它狠心的卸载了,今天就正确的安装上我们的Oracle。怎么卸载?卸载请点这里下面我们就来看一看具体的实施步骤吧!首先开水烫毛,将脏器取出,放上葱姜蒜等香料…下…锅…不好意思,走错片场了下载没有安装包,等我给你下载呐?好吧,这次就帮你一次吧!官方下地址:甲骨文官网如果你不想忍受英文的肆虐,那么直接点下面的连接吧!win3…

发表回复

您的电子邮箱地址不会被公开。

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