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

时间:2017-07-16 04:11:23

标签: python-3.x python-xarray

我将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  

之后我可能需要选择var_a之类的东西。我的代码最终看起来像这样:

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

对于Xarrays来说,也许我还很新鲜,但我无法在文档中找到更好的方法。我错过了一些关于xarrays的结构知识让我无法使用当前的解决方案吗?任何提示?

1 个答案:

答案 0 :(得分:3)

xarray对象上的表达式通常会返回相同类型的新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())