0

0

如何使用 cubic 方法对含 NaN 的二维规则网格数据进行非结构化坐标插值

聖光之護

聖光之護

发布时间:2026-01-08 16:14:27

|

282人浏览过

|

来源于php中文网

原创

如何使用 cubic 方法对含 NaN 的二维规则网格数据进行非结构化坐标插值

本文详解如何在存在大量 nan 值的二维规则经纬度网格上,对任意散点坐标(unstructured 2d coordinates)执行稳健的三次插值(cubic interpolation),绕过 `regulargridinterpolator` 对 nan 的严格限制,并推荐使用 `scipy.interpolate.griddata` 实现无缝、准确且可扩展的解决方案。

scipy.interpolate.RegularGridInterpolator 在 method='cubic' 模式下底层调用 B 样条拟合(make_interp_spline),该函数强制要求输入值数组中不能包含任何 NaN 或 inf —— 即使这些 NaN 仅位于数据边缘或稀疏无效区域,也会直接抛出 ValueError: Array must not contain infs or nans.。这与 method='linear' 的行为不同:线性插值通过分段线性外推+边界检查机制容忍局部 NaN(自动返回 fill_value 或引发可控错误),而三次插值需在整个维度上构建光滑样条,无法跳过缺失节点。

因此,当你的二维网格(如 20×50 的 lat0×lon0)含有约 40% 的 NaN 值时,不能直接将原始带 NaN 的 values 数组传入 RegularGridInterpolator(..., method='cubic')。你尝试的几种变通方式——如用 MaskedArray.compressed() 降维、改用 interp2d(其输出为笛卡尔积网格而非目标散点)、或手动剔除 NaN 后调用 interpn——均因维度不匹配或接口语义不符而失败。

✅ 正确解法是:放弃“规则网格插值器”的假设,转向“散点插值器”。scipy.interpolate.griddata 是专为此类场景设计的工具:它接受 (points, values) 形式的 非结构化 观测点集(即只提供有效数据点),并支持 'nearest'、'linear' 和 'cubic' 三种插值方法(后两者在 2D 中基于 Delaunay 三角剖分与分片多项式拟合)。

以下为针对你实际地理数据场景(经纬度网格 + 散点查询)的完整、鲁棒实现:

Mangaize
Mangaize

一键将照片转换为动漫风格的AI工具

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

# 假设你已有:
# lat0: (M,) 一维纬度向量(升序)
# lon0: (N,) 一维经度向量(升序)
# data_nan: (M, N) 二维网格数据,含大量 NaN
# lat, lon: (K,) 一维查询坐标数组(K 个散点,均在网格范围内)

# Step 1: 提取所有非 NaN 数据点的坐标和值
mask_valid = ~np.isnan(data_nan)
lat_flat = lat0[:, None]  # (M, 1)
lon_flat = lon0[None, :]  # (1, N)
lat_grid, lon_grid = np.broadcast_arrays(lat_flat, lon_flat)  # (M, N)

# 展平并筛选有效点 → 得到长度为 P 的散点集(P ≈ 60% × M×N)
valid_lat = lat_grid[mask_valid].ravel()   # (P,)
valid_lon = lon_grid[mask_valid].ravel()   # (P,)
valid_data = data_nan[mask_valid].ravel()  # (P,)

# Step 2: 对目标散点 (lat, lon) 执行 cubic 插值
# 注意:griddata 要求 query_points 形状为 (K, 2),故需堆叠
query_points = np.column_stack((lat, lon))        # (K, 2)
interped_cub = griddata(
    points=(valid_lat, valid_lon),  # 元组形式:(y_coords, x_coords)
    values=valid_data,
    xi=query_points,
    method='cubic',
    fill_value=np.nan  # 显式指定:超出凸包范围时返回 NaN(与 RegularGridInterpolator 行为一致)
)

# ✅ interped_cub.shape == (K,) —— 完美匹配你的预期输出!

⚠️ 关键注意事项

  • griddata 的 points 参数接受元组 (y, x),对应 lat(垂直方向)、lon(水平方向),顺序必须与你的网格定义一致;
  • 'cubic' 方法在 2D 中要求至少 16 个邻近点才能稳定拟合,若某查询点周围有效样本过少(如靠近大片 NaN 区域),结果可能失真或返回 fill_value;此时可结合 method='linear' 回退策略(见下方增强版);
  • 性能提示:对数千至数万查询点,griddata 效率良好;若需高频调用,建议预构建 LinearNDInterpolator 或 CloughTocher2DInterpolator 实例复用。

? 进阶健壮性增强(推荐用于生产)

from scipy.interpolate import LinearNDInterpolator, CloughTocher2DInterpolator

# 首选:CloughTocher2DInterpolator(显式 cubic,比 griddata 更可控)
try:
    interp_cubic = CloughTocher2DInterpolator(
        np.column_stack((valid_lat, valid_lon)), valid_data,
        fill_value=np.nan
    )
    interped_cub = interp_cubic(np.column_stack((lat, lon)))
except Exception as e:
    print(f"Cubic failed, falling back to linear: {e}")
    interp_linear = LinearNDInterpolator(
        np.column_stack((valid_lat, valid_lon)), valid_data,
        fill_value=np.nan
    )
    interped_cub = interp_linear(np.column_stack((lat, lon)))

总结:面对含 NaN 的规则网格插值需求,RegularGridInterpolator 的 'cubic' 模式并非适用工具;应主动转换范式,利用 griddata 或 CloughTocher2DInterpolator 等基于散点的插值器,它们天然支持稀疏、不规则观测,并能精确返回与查询点一一对应的 cubic 插值结果,同时保持对无效区域的合理处理(如返回 NaN)。这一方法已在气象、海洋等高缺失率网格数据业务中被广泛验证。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1007

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

56

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

2025.12.29

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

22

2026.01.09

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

37

2026.01.08

java学习网站汇总
java学习网站汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

正则表达式 删除
正则表达式 删除

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

49

2026.01.08

java 元空间 永久代
java 元空间 永久代

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

4

2026.01.08

java 永久代和元空间
java 永久代和元空间

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.4万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.3万人学习

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

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