使用 Xarray 在不丢失维度的情况下在 DataSet 中迭代添加 2D DataArrays 的 Pythonic 方法?

问题描述

我有一堆 xarray 数据集,由可变数量的 2D DataArrays 组成,大小都相同(纬度/经度暗淡)。我想得到 some 的总和数据集中的数据数组,不丢失任何维度。

我找到了一种方法来做到这一点,但似乎应该有一个内置函数/更pythonic的方法来做到这一点。可以在单行 for 循环中完成还是使用可迭代的?似乎大多数求和函数都迫使你失去一个维度。

# Build a fake dataset that is way,way smaller than what I have,with lat,lon as dims: 
ds=xr.Dataset()
lat=np.arange(20,50,2)
lon=np.arange(-130,-60,2.5)

ds['emis_NO']= xr.DataArray(np.random.random([len(lat),len(lon)]),dims=['lat','lon'])
ds['emis_NO2']= xr.DataArray(np.random.random([len(lat),'lon'])
ds['emis_ISOP']= xr.DataArray(np.random.random([len(lat),'lon'])
ds['emis_ACET']= xr.DataArray(np.random.random([len(lat),'lon'])

# Get a list of the DataArrays I want to Sum in this DataSet,ds,matching a 
# string naming convention (Sum emissions of NOx = NO + NO2). 
vars2sum=  [x for x in ds.data_vars if ('emis_NO' in x)]

# What follows is my solution that works,that I'd like to condense 
# if possible in a more pythonic way: 
total= ds[vars2sum[0]].values * 0 # create something right size,fill w/ 0s 

for darr in vars2sum:             # Loop over variables to sum. 
   total= total+ ds[darr].values  # iteratively update total. 

所需的输出相当于手动添加 DataArray,如下所示(假设您都知道)。

total= ds.emis_NO.values + ds.emis_NO2.values

我在一个函数内进行迭代,因为我在给定数据集中求和的 DataArray 数量(通过我的 str 匹配捕获)因数据集而异。

解决方法

您可以首先使用 to_array(默认情况下,新维度将命名为 'variable')沿新维度连接所选变量。然后,沿该维度求和:

ds[vars2sum].to_array().sum("variable")

或者,您可以使用列表推导式:

sum([ds[var] for var in vars2sum])