如何将等压相对湿度数据转换为二维数组形式?
How do I get isobaric relative humidity data into 2D array form?
我正在尝试在类似于 MetPy xarray tutorial 的恒定压力水平 (500hPa) 下创建相对湿度等值线图。我已经使用 Siphon 包获取了数据,并将其解析为一个数组,似乎 是二维的,时间和高度固定且 latitude/longitude 变化:
<xarray.DataArray 'relative_humidity' (time: 1, lat: 141, lon: 121)>
array([[[100. , 100. , ..., 48.5, 48.1],
[100. , 100. , ..., 42.8, 41.1],
...,
[ 9.5, 9.4, ..., 20.7, 18.7],
[ 9.5, 9.9, ..., 23.8, 21.1]]], dtype=float32)
Coordinates:
reftime (time) datetime64[ns] 2020-03-24T12:00:00
* time (time) datetime64[ns] 2020-03-24T18:00:00
isobaric float32 50000.0
* lat (lat) float32 55.0 54.75 54.5 54.25 54.0 ... 20.75 20.5 20.25 20.0
* lon (lon) float32 270.0 270.25 270.5 270.75 ... 299.5 299.75 300.0
crs object Projection: latitude_longitude
为了得到这个数组,我使用了代码:
data = ncss.get_data(query)
#Parse data using MetPy
ds = xr.open_dataset(NetCDF4DataStore(data))
data = ds.metpy.parse_cf()
#Rename variables to useful things
data = data.rename({
'Vertical_velocity_pressure_isobaric': 'omega',
'Relative_humidity_isobaric': 'relative_humidity',
'Temperature_isobaric': 'temperature',
'u-component_of_wind_isobaric': 'u',
'v-component_of_wind_isobaric': 'v',
'Geopotential_height_isobaric': 'height'
})
#Get data specific to 500mb
zH5 = data['height'].metpy.sel(vertical=850 * units.hPa)
zH5_crs = zH5.metpy.cartopy_crs
#Define coordinates
vertical, = data['temperature'].metpy.coordinates('vertical')
time = data['temperature'].metpy.time
x, y = data['height'].metpy.coordinates('x', 'y')
lat, lon = xr.broadcast(y, x)
#Create relative humidity array
rel_hum = data['relative_humidity'].metpy.sel(vertical=500*units.hPa)
但是,当我将 RH 绘制为填充轮廓时:
rh = ax.contourf(x, y, rel_hum, levels=[70, 80, 90, 100], colors=['#99ff00', '#00ff00', '#00cc00'])
我收到一条错误消息:
TypeError: Input z must be 2D, not 3D
阅读后 , I understand why the third parameter of the contour function needs to be a 2-D array, but I'm not sure why my procedure here (which very closely mimics the xarray tutorial code from the MetPy docs) 不会产生这样一个能够被绘制的数组。
所以虽然看起来你的数据是二维的,因为你只有一次,基于这个输出:
<xarray.DataArray 'relative_humidity' (time: 1, lat: 141, lon: 121)>
数据仍被视为 3D,因为您仍有时间维度(即使它的大小为 1)。一种方法是在特定时间将对 .sel
的调用修改为 select(或添加对 .sel
的另一个调用来执行此操作)。
我首选的解决方法是调用 .squeeze()
。 squeeze()
是一种删除所有 size-1 维度的方法,解决了这个非常常见的问题,即有一些无关的维度(实际上并没有添加到数组中的元素总数):
rel_hum = data['relative_humidity'].metpy.sel(vertical=500*units.hPa).squeeze()
这也有这样的效果,如果你真的有 3D 数据,它不会改变形状。根据您的应用程序,这可能是好事,也可能不是好事。 (如果不好,使用.sel
到select一次是更好的选择。)
我正在尝试在类似于 MetPy xarray tutorial 的恒定压力水平 (500hPa) 下创建相对湿度等值线图。我已经使用 Siphon 包获取了数据,并将其解析为一个数组,似乎 是二维的,时间和高度固定且 latitude/longitude 变化:
<xarray.DataArray 'relative_humidity' (time: 1, lat: 141, lon: 121)>
array([[[100. , 100. , ..., 48.5, 48.1],
[100. , 100. , ..., 42.8, 41.1],
...,
[ 9.5, 9.4, ..., 20.7, 18.7],
[ 9.5, 9.9, ..., 23.8, 21.1]]], dtype=float32)
Coordinates:
reftime (time) datetime64[ns] 2020-03-24T12:00:00
* time (time) datetime64[ns] 2020-03-24T18:00:00
isobaric float32 50000.0
* lat (lat) float32 55.0 54.75 54.5 54.25 54.0 ... 20.75 20.5 20.25 20.0
* lon (lon) float32 270.0 270.25 270.5 270.75 ... 299.5 299.75 300.0
crs object Projection: latitude_longitude
为了得到这个数组,我使用了代码:
data = ncss.get_data(query)
#Parse data using MetPy
ds = xr.open_dataset(NetCDF4DataStore(data))
data = ds.metpy.parse_cf()
#Rename variables to useful things
data = data.rename({
'Vertical_velocity_pressure_isobaric': 'omega',
'Relative_humidity_isobaric': 'relative_humidity',
'Temperature_isobaric': 'temperature',
'u-component_of_wind_isobaric': 'u',
'v-component_of_wind_isobaric': 'v',
'Geopotential_height_isobaric': 'height'
})
#Get data specific to 500mb
zH5 = data['height'].metpy.sel(vertical=850 * units.hPa)
zH5_crs = zH5.metpy.cartopy_crs
#Define coordinates
vertical, = data['temperature'].metpy.coordinates('vertical')
time = data['temperature'].metpy.time
x, y = data['height'].metpy.coordinates('x', 'y')
lat, lon = xr.broadcast(y, x)
#Create relative humidity array
rel_hum = data['relative_humidity'].metpy.sel(vertical=500*units.hPa)
但是,当我将 RH 绘制为填充轮廓时:
rh = ax.contourf(x, y, rel_hum, levels=[70, 80, 90, 100], colors=['#99ff00', '#00ff00', '#00cc00'])
我收到一条错误消息:
TypeError: Input z must be 2D, not 3D
阅读后
所以虽然看起来你的数据是二维的,因为你只有一次,基于这个输出:
<xarray.DataArray 'relative_humidity' (time: 1, lat: 141, lon: 121)>
数据仍被视为 3D,因为您仍有时间维度(即使它的大小为 1)。一种方法是在特定时间将对 .sel
的调用修改为 select(或添加对 .sel
的另一个调用来执行此操作)。
我首选的解决方法是调用 .squeeze()
。 squeeze()
是一种删除所有 size-1 维度的方法,解决了这个非常常见的问题,即有一些无关的维度(实际上并没有添加到数组中的元素总数):
rel_hum = data['relative_humidity'].metpy.sel(vertical=500*units.hPa).squeeze()
这也有这样的效果,如果你真的有 3D 数据,它不会改变形状。根据您的应用程序,这可能是好事,也可能不是好事。 (如果不好,使用.sel
到select一次是更好的选择。)