如何将Xarray DataArray中不在指定坐标列表内的值设为NaN?
问题
我有一个基于矩形二维网格的Xarray DataArray,以及一个存储在pandas DataFrame中的坐标点列表,这些点是该网格的任意子集。请问如何将DataArray中不在该坐标列表内的网格点值掩码(即设为NaN)?
示例DataArray
In [35]: da = xr.DataArray(data=np.random.randint(10, size=(5, 6)), coords={"x": np.linspace(0, 10, 5), "y": np.linspace(0, 12, 6)}) In [36]: da Out[36]: <xarray.DataArray (x: 5, y: 6)> array([[6, 0, 2, 3, 9, 8], [7, 6, 4, 8, 5, 8], [7, 4, 4, 5, 4, 7], [9, 8, 8, 1, 8, 0], [8, 9, 4, 3, 3, 6]]) Coordinates: * x (x) float64 0.0 2.5 5.0 7.5 10.0 * y (y) float64 0.0 2.4 4.8 7.2 9.6 12.0
示例DataFrame
In [44]: coords = pd.DataFrame([[2.5, 4.8], [2.5, 7.2], [5.0, 12.0], [7.5, 7.2], [10.0, 2.4]], columns=["x_coord", "y_coord"]) In [45]: coords Out[45]: x_coord y_coord 0 2.5 4.8 1 2.5 7.2 2 5.0 12.0 3 7.5 7.2 4 10.0 2.4
预期输出
Out[84]: <xarray.DataArray (x: 5, y: 6)> array([[nan, nan, nan, nan, nan, nan], [nan, nan, 4., 8., nan, nan], [nan, nan, nan, nan, nan, 7.], [nan, nan, nan, 1., nan, nan], [ 8., nan, nan, nan, nan, nan]]) Coordinates: * x (x) float64 0.0 2.5 5.0 7.5 10.0 * y (y) float64 0.0 2.4 4.8 7.2 9.6 12.0
解决方案
方法一:循环匹配坐标(适合少量点)
先构建与原DataArray同维度的全False掩码,逐个标记坐标列表中的有效点,最后用where方法将非有效点设为NaN:
import xarray as xr import pandas as pd import numpy as np # 初始化示例数据 da = xr.DataArray(data=np.random.randint(10, size=(5, 6)), coords={"x": np.linspace(0, 10, 5), "y": np.linspace(0, 12, 6)}) coords = pd.DataFrame([[2.5, 4.8], [2.5, 7.2], [5.0, 12.0], [7.5, 7.2], [10.0, 2.4]], columns=["x_coord", "y_coord"]) # 创建全False的掩码数组 mask = xr.DataArray(False, coords=da.coords, dims=da.dims) # 遍历坐标列表,标记有效点 for _, (x, y) in coords.iterrows(): mask.loc[{"x": x, "y": y}] = True # 应用掩码,生成结果 masked_da = da.where(mask)
方法二:批量匹配(适合大量点)
通过堆叠坐标维度为元组,利用isin方法批量筛选有效点,避免循环提升效率:
# 将DataFrame中的坐标转为(x,y)元组列表 valid_coords = list(zip(coords["x_coord"], coords["y_coord"])) # 堆叠x和y维度为单个xy维度 stacked_da = da.stack(xy=("x", "y")) # 保留有效坐标点,其余设为NaN后恢复原维度结构 masked_da = stacked_da.where(stacked_da.xy.isin(valid_coords), drop=False).unstack()
两种方法均可得到符合预期的掩码后DataArray,批量匹配法更适合处理大量坐标点的场景。
内容的提问来源于stack exchange,提问作者ogb119
相关产品推荐
相关产品推荐

