【问题标题】:Concise way to filter data in xarray在 xarray 中过滤数据的简洁方法
【发布时间】:2016-12-17 11:30:51
【问题描述】:

我需要对 xarray 数组中的值应用一个非常简单的“匹配语句”:

  1. 如果值 > 0,则设为 2
  2. 如果值 == 0,则设为 0
  3. 如果值为NaN,则设为NaN

这是我目前的解决方案。我正在使用NaNs、.fillna 和类型强制来代替二维索引。

valid = date_by_items.notnull()
positive = date_by_items > 0
positive = positive * 2
result = positive.fillna(0.).where(valid)
result

这改变了这一点:

In [20]: date_by_items = xr.DataArray(np.asarray((list(range(3)) * 10)).reshape(6,5), dims=('date','item'))
    ...: date_by_items
    ...: 
Out[20]: 
<xarray.DataArray (date: 6, item: 5)>
array([[0, 1, 2, 0, 1],
       [2, 0, 1, 2, 0],
       [1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1],
       [2, 0, 1, 2, 0],
       [1, 2, 0, 1, 2]])
Coordinates:
  * date     (date) int64 0 1 2 3 4 5
  * item     (item) int64 0 1 2 3 4

...到这个:

Out[22]: 
<xarray.DataArray (date: 6, item: 5)>
array([[ 0.,  2.,  2.,  0.,  2.],
       [ 2.,  0.,  2.,  2.,  0.],
       [ 2.,  2.,  0.,  2.,  2.],
       [ 0.,  2.,  2.,  0.,  2.],
       [ 2.,  0.,  2.,  2.,  0.],
       [ 2.,  2.,  0.,  2.,  2.]])
Coordinates:
  * date     (date) int64 0 1 2 3 4 5
  * item     (item) int64 0 1 2 3 4

在 pandas 中 df[df&gt;0] = 2 就足够了。我肯定在做一些行人的事情,而且有更简洁的方法吗?

【问题讨论】:

    标签: python python-xarray


    【解决方案1】:

    如果您愿意将内存中的数据作为 NumPy 数组加载,您可以使用 NumPy 修改 DataArray 值:

    date_by_items.values[date_by_items.values > 0] = 2
    

    如果xarray 支持whereother 参数,最简洁的处理方法是,但我们还没有实现(希望很快——基础已经奠定!)。当它工作时,你就可以写date_by_items.where(date_by_items &gt; 0, 2)

    无论哪种方式,您都需要执行两次才能应用您的两个条件。

    【讨论】:

      【解决方案2】:

      xarray 现在支持.where(condition, other),所以现在有效:

      result = date_by_items.where(date_by_items > 0, 2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多