如何将基于原始网格坐标的时序网格数据插值到新网格坐标?
如何将基于原始网格坐标的时序网格数据插值到新网格坐标?
嘿,我来帮你把scipy.interpolate.griddata的用法给掰明白,针对你这个时序网格数据的场景,一步步拆解,保证你能搞清楚坐标和数据该怎么放:
先明确核心变量的对应关系
首先得把你的数据和坐标的形状、对应关系理清楚,这是最容易踩坑的地方:
- 你的
data_flat是(8775, 100)的数组:每一行对应一个时间步,每一列对应原始10x10网格展平后的一个点的数值; - 原始坐标
x_orig、y_orig:应该是和数据展平顺序完全一致的一维数组(形状(100,)),比如原始10x10网格按行展平,那x_orig和y_orig也要按同样的行优先顺序把每个网格点的坐标列出来; - 新坐标
x_new、y_new:同理,是新的10x10网格展平后的一维坐标数组(形状(100,)),顺序也要和你期望的新数据输出顺序对应。
把坐标转换成griddata需要的格式
griddata要求原始点和目标点都是(N, 2)的二维数组(每一行是一个点的(x,y)坐标),所以先把你的一维坐标组合起来:
import numpy as np from scipy.interpolate import griddata # 假设你已经加载好这些变量: # data_flat: (8775, 100) # x_orig, y_orig: (100,) 原始网格展平后的坐标 # x_new, y_new: (100,) 新网格展平后的坐标 # 组合原始坐标点 orig_points = np.column_stack((x_orig, y_orig)) # 组合新坐标点 new_points = np.column_stack((x_new, y_new))
对时序数据做插值(两种方式)
因为你有8775个时间步,有两种处理方式:
方式1:循环遍历每个时间步(直观易懂)
适合刚上手的情况,逻辑清晰:
# 初始化结果数组,形状和原数据一致 interpolated_data = np.zeros_like(data_flat) for timestep in range(data_flat.shape[0]): # 取出当前时间步的所有网格点数值(形状(100,)) current_values = data_flat[timestep, :] # 调用griddata插值,结果是当前时间步新网格的数值(形状(100,)) interpolated_data[timestep, :] = griddata(orig_points, current_values, new_points, method='linear')
方式2:向量化处理(效率更高)
如果数据量很大,循环会比较慢,可以用向量化的方式一次性处理所有时间步:
# 把data_flat转置成(100, 8775),让每个列对应一个时间步 # griddata会自动对每一列(每个时间步)做插值,结果是(100, 8775) # 最后再转置回(8775, 100)就是我们要的格式 interpolated_data = griddata(orig_points, data_flat.T, new_points, method='linear').T
关键注意事项
- 坐标顺序必须严格匹配:
x_orig、y_orig的顺序一定要和data_flat每一行的100个数值的顺序完全对应,不然插值结果会完全错乱; - 插值方法选择:
method参数可以选'linear'(线性插值,默认)、'nearest'(最近邻插值,适合避免NaN)、'cubic'(三次样条插值,更平滑但计算量大);如果新网格的点超出了原始坐标的范围,linear和cubic会返回NaN,nearest会继续外插; - 如果新坐标是网格形式(不是展平的):比如你手里的新坐标是x轴的10个值和y轴的10个值,那需要先转换成网格再展平:
# 假设新坐标是x_new_axis: (10,), y_new_axis: (10,) x_new_grid, y_new_grid = np.meshgrid(x_new_axis, y_new_axis) # 展平成(100, 2)的坐标数组 new_points = np.column_stack((x_new_grid.ravel(), y_new_grid.ravel()))
备注:内容来源于stack exchange,提问作者mbarnfield63
相关产品推荐
相关产品推荐

