如何在不执行计算的情况下对齐Xarray的维度?
无需冗余计算实现xarray DataArray跨维度对齐
我有两个维度部分重叠的DataArray,执行计算时结果会根据重叠维度自动对齐,但不想用y_da.y * x_da.x/x_da.x这种冗余计算来实现对齐,试过align、broadcast、merge都没成功,求解决方法。
方法1:直接用xr.broadcast对齐
xr.broadcast能自动识别共享维度,把数组广播到共同形状,刚好适配你的场景:
# 广播y和x,取第一个结果就是对齐后的y aligned_y = xr.broadcast(y_da.y, x_da.x)[0] # 把对齐后的y赋值到x_da里 ds = x_da.assign(y=aligned_y)
原理很简单:两个数组共享rating维度,broadcast会自动把y_da.y的(rating, horizon)形状扩展成和x_da一致的(user, reporting_date, rating, horizon),完全实现和冗余计算一样的对齐效果,还没多余运算。
方法2:扩展维度后手动对齐
如果想更清晰地控制维度步骤,可以先给y_da加上x_da的维度,再调整顺序:
# 给y_da添加user和reporting_date维度,直接复用x_da的维度值 y_expanded = y_da.y.expand_dims( user=x_da.user, reporting_date=x_da.reporting_date ) # 调整维度顺序,让rating维度自然对齐 aligned_y = y_expanded.transpose("user", "reporting_date", "rating", "horizon") # 赋值到原数据集 ds = x_da.assign(y=aligned_y)
这样操作后,xarray会自动根据rating的取值匹配对应的数据,不需要额外计算。
验证结果
运行代码后查看指定用户的数据:
display(ds.sel({"user":"A"}).y)
输出和原来的冗余计算结果完全一致。
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

