检查值是否存在于 python xarray 数据集中

Check if value exists in python xarray dataset

我正在将 xarray 切割成用于机器学习过程的小数据立方体,并试图过滤掉其中没有数据值的立方体。

我想保持较小的内存占用,并已将不太可能的值 -999 分配给无数据值。这样做是为了保留 int16 而不是 nan

需要更大的类型

问题:检查 xarray.Dataset 中是否存在 -999 的最佳方法是什么?

这是我所拥有的:

(dataset == -999).any()  

产量:

<xarray.Dataset>
Dimensions:  ()
Data variables:
    var_a      bool True
    var_b      bool True
    var_c      bool False  

之后我可能不得不 select 类似 var_a 的东西。我的代码最终看起来像这样:

def is_clean(dataset):
    return (dataset == -999).any().var_a is True 

也许我对 Xarrays 还很陌生,但我在文档中找不到更好的方法来执行此操作。我缺少哪些有关 xarray 的结构知识,使我无法接受当前的解决方案?有什么提示吗?

xarray 对象上的表达式通常 return 相同类型的新 xarray 对象。这意味着 (dataset.var_a == -999).any() 结果是一个标量 xarray.DataArray 对象。

与标量 NumPy 数组一样,标量 DataArray 对象可以通过调用 bool()float() 等内置类型来收件箱。例如,这隐含地发生在 if 语句的条件内。也像 NumPy 数组一样,您可以使用 .item() 方法拆箱任何 dtype 的标量 DataArray。

要检查数据集中的每个数据变量,您需要使用类似访问的字典来遍历数据集,例如,

def is_clean(dataset):
    return all((v != -999).all() for v in dataset.data_vars.values())

或者您可以通过调用 .to_array() 将整个数据集转换为单个 DataArray,例如,

def is_clean(dataset):
    return bool(dataset.to_array() != -999).all())

为了避免过多的内存使用,你可以在减少后转换为数组,这会稍微长一点但还不错:

def is_clean(dataset):
    return bool((dataset != -999).all().to_array().all())