从NetCDF读取插值数据遇形状不匹配错误,求非裁剪解决方案
解决NetCDF网格插值的维度不匹配问题
你遇到的ValueError是因为直接对一维的lat(103个元素)和lon(61个元素)做flatten()后,两个数组长度不匹配,无法组成每个网格点对应的坐标对。griddata要求输入的坐标点是每个点对应一组(lat, lon),也就是需要把原始的一维经纬度先转换成和温度数据同维度的二维网格,再展平成一维坐标对。
以下是修正后的完整代码,完全匹配你的70×70网格+最近邻插值需求:
import numpy as np from netCDF4 import Dataset from scipy.interpolate import griddata # 加载NetCDF数据 nc_file = Dataset('data.nc', 'r') lat = nc_file.variables['lat'][:] # shape (103,) lon = nc_file.variables['lon'][:] # shape (61,) temp = nc_file.variables['temp'][:] # shape (103, 61) # 1. 将一维经纬度转换为二维网格,和temp维度严格匹配 lat_grid, lon_grid = np.meshgrid(lat, lon, indexing='ij') # 注:indexing='ij'保证网格形状为(103,61),和temp一致;默认'xy'会反转成(61,103) # 2. 展平坐标和温度数据,确保每个点的坐标与温度值一一对应 lat_flat = lat_grid.flatten() lon_flat = lon_grid.flatten() temp_flat = temp.flatten() # 3. 创建目标70×70网格(修正了你之前写的80,匹配需求) new_lat = np.linspace(lat.min(), lat.max(), 70) new_lon = np.linspace(lon.min(), lon.max(), 70) new_lat_grid, new_lon_grid = np.meshgrid(new_lat, new_lon) # 4. 执行最近邻插值(修正了你之前用的linear,匹配需求) new_temp = griddata((lat_flat, lon_flat), temp_flat, (new_lat_grid, new_lon_grid), method='nearest') # 保存结果 np.save('new_temp.npy', new_temp)
关键修正说明
np.meshgrid的indexing='ij'是核心:避免经纬度网格维度和温度数据反转,确保每个网格点的坐标与温度值严格对应。- 修正后
lat_flat、lon_flat、temp_flat的长度均为103×61=6283,完全满足griddata的输入要求,不会再出现维度不匹配错误。 - 同步修正了目标网格尺寸和插值方法,完全贴合你的需求。
内容的提问来源于stack exchange,提问作者pwnkit
相关产品推荐
相关产品推荐

