在xarray列上执行基础向量运算时遇空数组问题求助
问题分析与解决方法
为什么相减得到空数组?
你用to_array()把多变量合并成DataArray后,两个数组的variable维度标签完全不匹配:leo的标签是['xLeo','yLeo','zLeo'],gps的是['xGps','yGps','zGps']。xarray的核心特性是维度自动对齐,运算时只会保留两边维度标签完全一致的元素,没有匹配项就返回空数组。
重命名报错的原因
to_array()执行后,原来的列名(比如xLeo)不是维度名或变量名,而是variable维度的坐标标签。rename()函数只能修改维度名或变量名,无法修改维度的坐标值,所以会报错。
正确的解决方法
方法1:统一维度坐标标签后运算
修改variable维度的坐标标签,让两个数组的对应分量标签一致,就能正常运算:
ds = xr.open_dataset(data_path) # 合并变量并统一variable维度的标签为x/y/z leo = ds[['xLeo','yLeo','zLeo']].to_array().assign_coords(variable=['x', 'y', 'z']) gps = ds[['xGps','yGps','zGps']].to_array().assign_coords(variable=['x', 'y', 'z']) # 现在可以正常执行向量加减 vector_diff = gps - leo
此时vector_diff的shape会是(3, 5199),和预期一致。
方法2:逐分量运算后合并
如果觉得维度标签处理麻烦,也可以直接对每个坐标分量单独运算,再合并成向量数组:
ds = xr.open_dataset(data_path) # 逐分量计算差值 diff_x = ds['xGps'] - ds['xLeo'] diff_y = ds['yGps'] - ds['yLeo'] diff_z = ds['zGps'] - ds['zLeo'] # 合并为一个向量DataArray vector_diff = xr.concat([diff_x, diff_y, diff_z], dim='variable').assign_coords(variable=['x','y','z'])
向量叉乘的实现
如果要执行叉乘,可以用xr.apply_ufunc包装numpy的叉乘函数,实现逐时间步的向量运算:
import numpy as np def vec_cross(a, b): return np.cross(a, b, axis=0) # 先确保leo和gps的variable维度标签一致(用方法1处理后的数组) cross_result = xr.apply_ufunc( vec_cross, leo, gps, input_core_dims=[['variable'], ['variable']], output_core_dims=[['variable']], vectorize=True )
内容的提问来源于stack exchange,提问作者user2823789
相关产品推荐
相关产品推荐

