You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:15:16