首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中使用二进制netcdf掩码?

如何在python中使用二进制netcdf掩码?
EN

Stack Overflow用户
提问于 2021-09-15 11:36:25
回答 2查看 99关注 0票数 1

我是使用cartopy包的新手。我想使用netcdf格式的给定二进制地图中的陆地和海洋掩码。这里,lsm_set是我的netcdf文件,其中包含该二进制映射,而t2m_set是我想要映射的数据。我还在玩cartopy,以掌握它的诀窍,但我似乎不知道如何使用陆地和海洋面膜。我在这里读到了几个相关的问题,但它们在我的代码中不起作用,因为我的t2m变量没有属性掩码。

我的老师说我可以用它将海值标记为"NaN“,但我不知道一种有效的方法。我试过使用while循环,但在处理这么多数据时速度非常慢:')

我在下面的链接上使用了哥白尼研究所的数据:https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-uerra-europe-single-levels?tab=form

代码语言:javascript
复制
import os
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc
from netCDF4 import Dataset
import xarray as xr
from cartopy import config
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader


filepath1 = '... file path... '
lsm_set = xr.open_dataset(filepath1)

filepath2 = '... file path...'
t2m_set= xr.open_dataset(filepath2) 

lons = lsm_set.variables['longitude']#[:]
lats = lsm_set.variables['latitude']#[:]
lsm = lsm_set.variables['lsm']
t2m = t2m_set.variables['t2m']

plt.figure(figsize=(8, 8))
ax = plt.axes(projection = ccrs.Mercator())
ax.contourf(lons[200:400,100:300], lats[100:300,200:400], t2m[100:300,100:300],transform=ccrs.Mercator())
lsm_set.close()
t2m_set.close()
plt.show()

任何在正确方向上的推动都是值得感谢的,谢谢!

解决了!

事实证明,解决方案比我想象的要简单得多。

代码语言:javascript
复制
lons = t2m_set.variables['longitude']#[:]
lats = t2m_set.variables['latitude']#[:]
lsm = lsm_set.variables['lsm']
t2m = t2m_set.variables['t2m'] 
lsm_masked = lsm.where(lsm!=0.)
mapdata = t2m+lsm_masked

然后绘制mapdata,而不仅仅是t2m

EN

回答 2

Stack Overflow用户

发布于 2021-09-16 12:58:17

您可以使用xarraywhere方法:

代码语言:javascript
复制
t2m_set.where(lsm_set)

它应该会给你一个屏蔽得很好的xarray.Dataset

票数 2
EN

Stack Overflow用户

发布于 2021-09-15 22:32:06

假设您的陆地/海洋数据为1和0,大小与您的数据相同……然后你就可以很容易地画出这样的图:

代码语言:javascript
复制
#!/usr/bin/env ipython
# --------------------
import matplotlib as mpl
mpl.rcParams['font.size'] = 18
import matplotlib.pylab as plt
import numpy as np
# -----------------------------
xx = np.linspace(9.,30,100);
yy = np.linspace(54.0,66.0,100);
xm,ym = np.meshgrid(xx,yy);
zz = 50.0 + 10.0*np.random.random((np.size(yy),np.size(xx)));
# -----------------------------
# let me have some random landmask/seamask data:
smask = np.zeros(np.shape(zz));smask[0:10,0:10]=1.0;smask[60:90,60:90]=1.0;
# -----------------------------
# let us set 0.0 to NaNs in seamask:
smask[smask==0]=np.nan;
smask=np.ma.array(smask,mask=np.isnan(smask))
# -----------------------------
# let us make a plot:
fig = plt.figure();ax=fig.add_subplot(111);
ax.pcolormesh(xx,yy,zz);
ax.pcolormesh(xx,yy,smask,vmin=0.0,vmax=8.0,cmap='Greys');
plt.show()
# ------------------------------------------------------------
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69192394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档