问题描述
我有一堆 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])