检查值是否存在于 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())
我正在将 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())