微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。