You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python绘制NOAA再分析NC文件报错‘Input z must be 2D, not 3D’求助

解决“Input z must be 2D, not 3D”错误方案

错误根源

你的omega变量是3D/4D维度(通常NOAA再分析数据的垂直速度变量维度为**[时间, 层次, 纬度, 经度]或[层次, 纬度, 经度]**),但Basemap.contourf()要求传入的变量必须是2D(仅纬度×经度的平面数据)。你当前写的omega[0,:,:]没有正确剥离多余维度,导致传入了3D数据。

修正步骤

1. 先确认变量维度结构

在读取omega后添加打印代码,明确数据结构:

print(omega.shape)
level = nc1.variables['level'][:]
print(level)  # 输出类似[1000, 850, 700, 500, 200]的气压层次值

比如输出(1,4,73,144)代表维度为[时间, 层次, 纬度, 经度];输出(4,73,144)代表维度为[层次, 纬度, 经度]。

2. 提取500hPa对应的2D数据

找到500hPa在level数组中的索引,再根据维度结构提取平面数据:

  • 如果是4D数据(时间+层次+经纬度):
    level_index = np.where(level == 500)[0][0]
    omega_500 = omega[0, level_index, :, :]  # 取第1个时间步+500hPa层次
    
  • 如果是3D数据(层次+经纬度):
    level_index = np.where(level == 500)[0][0]
    omega_500 = omega[level_index, :, :]  # 直接取500hPa层次
    

3. 替换contourf的输入变量

将原代码中的omega[0,:,:]替换为处理后的omega_500:

cs1 = map.contourf(X,Y, omega_500, clevs1, cmap='RdBu_r')

完整修正代码

from netCDF4 import Dataset as NetCDFFile 
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap

fig = plt.figure(figsize=(10,9), constrained_layout=True ) 
ax = fig.add_subplot(111).set_title('b1' , size=10 , fontweight='bold')
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0 )

nc1 = NetCDFFile('C:/Users/user/Desktop/project/nc2024Habib/final-mjo/obs1-vv-ac.nc')
lat = nc1.variables['lat'][:]
lon = nc1.variables['lon'][:]
level = nc1.variables['level'][:]
omega = nc1.variables['omega'][:]

# 打印维度和层次值,确认数据结构
print("omega维度:", omega.shape)
print("气压层次:", level)

# 获取500hPa对应的索引
level_index = np.where(level == 500)[0][0]

# 根据维度提取2D数据
if len(omega.shape) == 4:
    omega_500 = omega[0, level_index, :, :]
elif len(omega.shape) == 3:
    omega_500 = omega[level_index, :, :]
else:
    raise ValueError("omega变量维度不符合预期,请检查NC文件结构")

map= Basemap(projection='merc',llcrnrlon=0.,llcrnrlat=10.,urcrnrlon=80.,urcrnrlat=45.,resolution='i',fix_aspect=False)  
map.drawcoastlines()
map.drawstates()
map.drawcountries()
map.drawlsmask(land_color='Linen', ocean_color='#CCFFFF')
map.drawcounties() 

parallels = np.arange(15.,45.,5.)
meridians = np.arange(30.,70.,5.)
map.drawparallels(parallels,labels=[1,0,0,0],fontsize=10 , linewidth=0.9,dashes=[4,9900], fontweight='bold' ,fontstyle='oblique')
map.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10, linewidth=0.9,dashes=[4,9900] , fontweight='bold', fontstyle='oblique')

lons,lats= np.meshgrid(lon-180,lat )
X,Y = map(lons,lats)

clevs1 = np.arange(-0.02,0.01,0.005)
cs1 = map.contourf(X,Y, omega_500, clevs1,cmap='RdBu_r')
plt.show()

内容的提问来源于stack exchange,提问作者Sedighe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:13:31