0

0

如何在含缺失值的二维规则网格上对非结构化坐标进行三次样条插值

花韻仙語

花韻仙語

发布时间:2026-01-08 19:24:30

|

281人浏览过

|

来源于php中文网

原创

如何在含缺失值的二维规则网格上对非结构化坐标进行三次样条插值

`regulargridinterpolator` 不支持含 nan 的输入数据,需改用 `griddata` 等无结构插值器:先剔除 nan 网格点及其对应坐标,再以 `(x_flat, y_flat, z_flat)` 形式调用 `griddata(..., method='cubic')`,即可安全完成三次插值并天然处理边界与空洞区域。

当面对带大量 NaN 的二维规则地理网格(如 1°×1° 的纬度-经度场)并对任意散点坐标(如浮标位置或模型输出点)执行高阶平滑插值时,scipy.interpolate.RegularGridInterpolator 的 'cubic' 模式会直接报错 ValueError: Array must not contain infs or nans.——这是因为其底层依赖 make_interp_spline,而该函数严格要求输入值数组完全有限(finite),不接受任何缺失值。

根本原因在于:RegularGridInterpolator 是为“完整规则网格”设计的;它假设每个 (lat_i, lon_j) 都有定义良好的值,从而构建张量积样条基函数。一旦出现 NaN,不仅破坏了网格完整性,更导致沿任一维度做一维样条拟合时失败(如错误中 _do_spline_fit 所示)。

✅ 正确解法是切换到无结构(unstructured)插值范式:将原始网格展平为有效点云,再使用 scipy.interpolate.griddata。该函数原生支持 method='cubic'(基于分片双三次 Hermite 插值),且自动忽略无效点、鲁棒处理空洞邻域,并对查询点外推时返回 NaN(符合预期行为)。

以下是推荐实现流程(适配您的地理数据场景):

MiniMax Agent
MiniMax Agent

MiniMax平台推出的Agent智能体助手

下载
import numpy as np
from scipy.interpolate import griddata

# 假设 lat0 (shape: M), lon0 (shape: N), data_nan (shape: M×N)
# 其中 data_nan 含约 40% NaN,但所有查询点 (lat, lon) 均在网格范围内

# 1. 构建完整坐标网格并展平
latG, lonG = np.meshgrid(lat0, lon0, indexing='ij')  # shape: (M, N)
lat_flat = latG.ravel()
lon_flat = lonG.ravel()
data_flat = data_nan.ravel()

# 2. 筛选非 NaN 有效点(保留坐标与值的一致性)
mask_valid = ~np.isnan(data_flat)
points_valid = np.column_stack((lat_flat[mask_valid], lon_flat[mask_valid]))
values_valid = data_flat[mask_valid]

# 3. 对目标散点 (lat, lon) 执行三次插值
# 注意:griddata 要求查询点为 (N, 2) 形状的数组
xi = np.column_stack((lat, lon))  # shape: (K, 2)

interped_cub = griddata(
    points=points_valid,
    values=values_valid,
    xi=xi,
    method='cubic',
    fill_value=np.nan  # 显式指定越界/空洞处返回 NaN(默认即此行为)
)

# interped_cub.shape == (len(lat),) —— 与 linear 插值结果维度一致!

? 关键优势说明:

  • 自动容错:griddata 在 'cubic' 模式下会基于 Delaunay 三角剖分,仅利用局部有效邻点构造插值多项式,天然跳过 NaN 区域;
  • 语义一致:对靠近 NaN 区域的查询点,若缺乏足够邻近有效支撑点,结果自动为 NaN,与 RegularGridInterpolator(method='linear') 的失败行为逻辑统一;
  • 无需后处理:避免了“先线性 + 再最近邻填补”的两阶段繁琐流程;
  • ⚠️ 注意性能:griddata 的 'cubic' 比 'linear' 计算开销大,但对数千个查询点(如您的 ~2000)仍非常高效;若需更高性能,可考虑 scipy.interpolate.CloughTocher2DInterpolator(同样支持 fill_value,且缓存三角剖分)。

? 补充建议:

  • 若地理跨度大(如跨极区),建议先将经纬度转换为等距投影坐标(如 pyproj 中的 EPSG:3857 或 EPSG:4326 下的球面距离加权),以提升插值几何合理性;
  • 对于超大规模网格(>10⁵ 有效点),可启用 rescale=True 参数缓解坐标尺度差异导致的数值不稳定;
  • 验证时,可用小范围人工 NaN 区域对比 griddata 与手动掩膜后 RegularGridInterpolator('linear') 结果,确认空洞边缘过渡平滑性。

至此,您即可在保持代码简洁性的同时,获得比线性插值更光滑、比最近邻更物理合理的三次插值结果,且完全兼容真实地球科学数据中常见的稀疏、不规则缺失模式。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

387

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

571

2023.08.10

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

33

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号