在xarray中过滤数据的简洁方法
Concise way to filter data in xarray
我需要对 xarray 数组中的值应用一个非常简单的 'match statement':
- 如果值 > 0,则为 2
- 其中值== 0,使0
- 其中值为
NaN
,使NaN
这是我目前的解决方案。我正在使用 NaN
s、.fillna
和类型强制代替 2d 索引。
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>0] = 2
就足够了。当然我正在做一些行人并且有一个更简洁的方法?
如果您愿意将内存中的数据作为 NumPy 数组加载,您可以使用 NumPy 修改 DataArray 值:
date_by_items.values[date_by_items.values > 0] = 2
如果 xarray 支持 where
的 other
参数,那么处理这个问题的最干净的方法是,但我们还没有实现它(希望很快——基础已经奠定!) .如果可行,您将能够编写 date_by_items.where(date_by_items > 0, 2)
.
无论哪种方式,您都需要执行此操作两次才能应用您的两个标准。
xarray 现在支持 .where(condition, other)
,所以现在有效:
result = date_by_items.where(date_by_items > 0, 2)
我需要对 xarray 数组中的值应用一个非常简单的 'match statement':
- 如果值 > 0,则为 2
- 其中值== 0,使0
- 其中值为
NaN
,使NaN
这是我目前的解决方案。我正在使用 NaN
s、.fillna
和类型强制代替 2d 索引。
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>0] = 2
就足够了。当然我正在做一些行人并且有一个更简洁的方法?
如果您愿意将内存中的数据作为 NumPy 数组加载,您可以使用 NumPy 修改 DataArray 值:
date_by_items.values[date_by_items.values > 0] = 2
如果 xarray 支持 where
的 other
参数,那么处理这个问题的最干净的方法是,但我们还没有实现它(希望很快——基础已经奠定!) .如果可行,您将能够编写 date_by_items.where(date_by_items > 0, 2)
.
无论哪种方式,您都需要执行此操作两次才能应用您的两个标准。
xarray 现在支持 .where(condition, other)
,所以现在有效:
result = date_by_items.where(date_by_items > 0, 2)