如何对维度重叠的两个xarray执行外连接求和?
解决xarray外连接后求和(缺失值按0处理)的问题
要实现两个xarray数组在指定维度上的外连接求和(缺失值按0计算),可以通过以下几种简洁方式实现:
方法1:重新索引补0后相加
先提取所有唯一的坐标值,将两个数组重新索引到完整坐标集并填充0,再执行加法:
import xarray as xr x = xr.DataArray([1,2,3], dims=("x"), coords={"x": ['a', 'b', 'c']}) y = xr.DataArray([10,20,30], dims=("x"), coords={"x": ['b', 'c', 'd']}) # 获取所有唯一的x坐标 all_x_coords = list(set(x.x.values) | set(y.x.values)) # 重新索引并填充缺失值为0 x_expanded = x.reindex(x=all_x_coords, fill_value=0) y_expanded = y.reindex(x=all_x_coords, fill_value=0) # 执行求和 result = x_expanded + y_expanded # 按x坐标排序(可选,让结果更规整) result = result.sortby("x") print(result)
输出结果:
<xarray.DataArray (x: 4)> array([ 1, 12, 23, 30]) Coordinates: * x (x) object 'a' 'b' 'c' 'd'
方法2:合并数据集后求和
利用xr.merge执行外连接合并,再将缺失值填充为0后求和:
import xarray as xr x = xr.DataArray([1,2,3], dims=("x"), coords={"x": ['a', 'b', 'c']}) y = xr.DataArray([10,20,30], dims=("x"), coords={"x": ['b', 'c', 'd']}) # 合并两个数组为数据集(外连接) merged_ds = xr.merge([x.rename("arr1"), y.rename("arr2")], join="outer") # 填充缺失值为0后求和 result = merged_ds.fillna(0).sum(dim="variable") # 排序坐标 result = result.sortby("x") print(result)
原理说明
xarray默认的算术运算(如x+y)采用内连接,仅保留两个数组共有的坐标。要实现外连接求和,核心是先将两个数组扩展到完整的坐标集,把缺失位置的值填充为0,再执行加法操作。
内容的提问来源于stack exchange,提问作者Alvaro Aguilar
相关产品推荐
相关产品推荐

