python - 使用 Xarray 在 DataSet 中迭代添加 2D DataArrays 而不会丢失维度的 Pythonic 方法?
问题描述
我有一堆由可变数量的 2D DataArrays 组成的 xarray 数据集,大小都相同(纬度/经度暗淡)。我想得到数据集中一些DataArrays 的总和,而不会丢失任何维度.
我找到了一种方法来做到这一点,但似乎应该有一个内置的函数/更 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), len(lon)]), dims=['lat','lon'])
ds['emis_ISOP']= xr.DataArray(np.random.random([len(lat), len(lon)]), dims=['lat','lon'])
ds['emis_ACET']= xr.DataArray(np.random.random([len(lat), len(lon)]), dims=['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.
所需的输出相当于手动添加 DataArrays,如下所示(假设您都知道它们)。
total= ds.emis_NO.values + ds.emis_NO2.values
我在一个函数中进行迭代,因为我在给定 DataSet 中求和的 DataArrays 的数量(通过我的 str 匹配捕获)因数据集而异。
解决方案
to_array
您可以首先使用(默认情况下,新维度将命名为)沿新维度连接所选变量'variable'
。然后,沿该维度求和:
ds[vars2sum].to_array().sum("variable")
或者,您可以使用列表推导:
sum([ds[var] for var in vars2sum])
推荐阅读
- c# - C#如何让不同速度的进程一起工作
- javascript - 回调函数有问题
- python - Python:无名关键字参数列表
- android - Android 单元测试改造失败
- java - 使用 mySQL 从 Spring Boot 开始时,Javers 给出重复的键名“jv_global_id_owner_id_fk_idx”
- kql - 如何在日期之间创建 kql 查询
- three.js - three.js 失真,glb (gltf) 模型上的颜色替换。蓝色变为绿色,黄色变为橙色
- powershell - 在 dc 调用命令 - 获取 gpinheritance - 不起作用
- regex - 如何从以下 reg 表达式响应中排除最后一个字符
- python - 找出列表中直到特定索引的唯一元素的程序