我将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的结构知识让我无法使用当前的解决方案吗?任何提示?
答案 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())