1
\ begingroup美元

我真的需要帮助,我工作每ERA5压力水平的数据。我提取的相对湿度和温度对几个大气压力水平。我使用Metpy的dewpoint_from_relative_humidity函数来计算露点。表非常大,所以我使用dask创建几块。我有如下表:

进口numpy一样np进口metpy议员metpy进口。calc一样mpcalc进口xarray xr metpy进口。单位与dask.config.set mpunit (* * {array.slicing。split_large_chunks”:真正的}):ncin_1 = xr。open_dataset (ncfname_1、发动机= netcdf4) .chunk(汽车的)ncin_1 [' t '] = ncin_1 [' t '] - 273.15 ncin_1 [' r '] = ncin_1 ncin_1 100.0 [' r '] / [' r '] = ncin_1 [' r '] .clip (min = 0.01, max = 1) #与metpy单位注册表变量后处理ncin_1(的水平)。attrs(“单位”)= ' hPa ncin_1 = ncin_1.metpy.quantify () ncin_1['时间']= ncin_1 .metpy‘时间’。时间ncin_1[“纬度”]= ncin_1 .metpy“纬度”。经度纬度ncin_1 [' ') = ncin_1 .metpy的经度。经度ncin_1[“水平”]= ncin_1 .metpy“水平”。垂直ncin_1 [' t '] = ncin_1 [' t '] * mpunit.units.degC ncin_1[“露点”]= ncin_1(“露点”)* mpunit.units.degC ncin_1 [' r '] = ncin_1 [' r '] * mpunit.units。无量纲#压力水平降序ncin_1 = ncin_1。((ncin_1(的水平)> = 100)&(测试(的水平)< = 1000),下降= True) ncin_1 = ncin_1。sortby(“水平”,提升= False) #创建一个概要文件变量是填写ncin_1(“资料”)=((“时间”、“水平”,“自由”,“经度”),np。full_like (ncin_1 [' t '], fill_value = np.nan))
< xarray。数据set> Dimensions: (longitude: 60, latitude: 41, level: 21, time: 24836) Coordinates: * longitude (longitude) float32 -5.02 -4.77 -4.52 -4.27 ... 9.23 9.48 9.73 * latitude (latitude) float32 51.15 50.9 50.65 50.4 ... 41.65 41.4 41.15 * level (level) int32 20 50 100 150 200 250 ... 750 800 850 900 950 1000 * time (time) datetime64[ns] 2006-01-01 ... 2022-12-31T18:00:00 Data variables: r (time, level, latitude, longitude) float32 0.03323 ... 0.7702 t (time, level, latitude, longitude) float32 -69.07 ... 14.25 dewpoint (time, level, latitude, longitude) float32 -90.23 ... 10.28 profil (time, level, latitude, longitude) float32 nan nan ... nan nan Attributes: Conventions: CF-1.6 history: 2023-07-19 22:32:41 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...

我想计算了指数(使用metpy lifted_index功能),但是首先我需要计算parcel_profile变量。问题是,这个函数是一个一维函数,根据文档。我做了几个脚本使用xarray。apply_ufunc或xarray.map_blocks。

  1. 些微xarray。apply_ufunc:
def wrapper_parcel_profile(压力、温度、露点):返回mpcalc。parcel_profile(压力*单位。hPa、温度* units.degC露点* units.degC),(“摄氏度”)t_1000 = ncin_1 [' t '] .metpy.sel(水平= 1000)dewpoint_1000 = ncin_1(“露点”).metpy.sel(水平= 1000)压力= ncin_1 ncin_1(“水平”)(“资料”)= xr。apply_ufunc (wrapper_parcel_profile、压力、t_1000、dewpoint_1000 input_core_dims =[(的水平),(‘时间’,‘自由’,'经度'],[‘时间’,‘自由’,‘经度]],output_core_dims =[[“时间”、“水平”,“自由”,“经度”]],vectorize = True, dask =“并行”,output_dtypes =(浮动),dask_gufunc_kwargs = {“allow_rechunk”:真})

这个脚本运行使用dask因为我,所以如果我理解正确的话,只要我不运行ncin_1.compute()命令,没有直接计算。我得到这个错误信息:

ValueError:操作数不能一起广播形状(19日)(24836年,41岁的60)(它必须与ncin_1(“水平”)?)

  1. xarray。map_block:
def wrapper_parcel_profile(压力、温度、露点):返回mpcalc。parcel_profile(压力*单位。hPa、温度* units.degC露点* units.degC),(摄氏度)压力=测试(的水平)t_1000 =测试[' t '] .metpy.sel(水平= 1000)* units.degC dewpoint_1000 =测试(“露点”).metpy.sel(水平= 1000)*(“资料”)= xr units.degC测试。map_blocks (wrapper_parcel_profile、测试模板=测试[' t '])

我得到这个错误消息,当我用“ncin_1.compute()”在我的数据库

TypeError:混合分块数组类型不受支持,但是收到多种类型:{},

我的方法是正确的吗?有可能这仅仅通过在一个xarray数据集吗?我找到合适的解决办法?提前感谢你的帮助

新的因素
nietreil这个网站是一个新的贡献者。照顾在要求澄清,评论和回答。看看我们的行为准则
\ endgroup美元

    0

    你的答案

    nietreil是一个新的贡献。很好,看看我们的行为准则

    通过点击“发布你的答案”,你同意我们服务条款并承认您已阅读并理解我们的隐私政策的行为准则

    浏览其他问题标记问你自己的问题