【问题标题】:Check if value exists in python xarray dataset检查python xarray数据集中是否存在值
【发布时间】:2017-07-16 16:20:36
【问题描述】:

我正在将 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 的哪些结构知识让我无法接受当前的解决方案?有什么提示吗?

【问题讨论】:

  • return (dataset.var_a == -999).any() ?
  • 感谢您的回复。我的问题是 return (dataset.var_a == -999).any() 将返回 xr.Dataset 而不是布尔值。
  • 返回的xr.Dataset的维度是多少?
  • 以上部分显示了实际输出。没有维度。只有三个具有布尔值的变量。
  • 我指的是我的构造的维度。我没有安装 XArray。

标签: python-3.x python-xarray


【解决方案1】:

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() 将整个 Dataset 转换为单个 DataArray,例如,

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

为了避免过多的内存使用,您可能会在 减少后转换为数组,这会更长一些但还不错:

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

【讨论】:

  • 感谢您的出色回答。鉴于我对 pandas/numpy 的了解,这是我的期望。我想我应该安装 xarray,并学习一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多