首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取布尔型DataArray中True值的索引

获取布尔型DataArray中True值的索引
EN

Stack Overflow用户
提问于 2019-02-20 23:18:55
回答 1查看 654关注 0票数 0

在xarray中获取布尔型DataArray的True值的索引的合适方法是什么?我知道numpy的方式是使用np.where,但这对于多维数组来说并不方便:

代码语言:javascript
运行
复制
>>> da = xr.DataArray([0., 1., 2.])
>>> da > 0
<xarray.DataArray (dim_0: 3)>
array([False,  True,  True])
Dimensions without coordinates: dim_0
>>> np.where(da > 0)[0]
array([1, 2])

>>> db = xr.DataArray([[0.,1.,2.],[2.,1.,0.]])
>>> db > 0
<xarray.DataArray (dim_0: 2, dim_1: 3)>
array([[False,  True,  True],
       [ True,  True, False]])
Dimensions without coordinates: dim_0, dim_1
>>> np.where(db > 0)
Out[61]: (array([0, 0, 1, 1]), array([1, 2, 0, 1]))

我想知道是否可以使用xarray功能更优雅地完成它。

原因是我想有选择地修改数组的某些部分,但首先,这不适用于多维布尔索引:

代码语言:javascript
运行
复制
>>> da[da > 0] *= 2
>>> da
<xarray.DataArray (dim_0: 3)>
array([0., 2., 4.])
Dimensions without coordinates: dim_0

>>> db[db > 0] *= 2
Traceback (most recent call last):
    [...]
IndexError: 2-dimensional boolean indexing is not supported. 

其次,在某些情况下,我经常重用布尔DataArray作为索引器,我想看看是否可以避免查找相关索引值的开销。(我没有对此做过任何分析;所以这个理由不是很合理。)

EN

Stack Overflow用户

发布于 2019-03-05 16:00:19

我发现的一种方法是使用stackunstack

代码语言:javascript
运行
复制
>>> dc = db.stack(z=('dim_0', 'dim_1'))
>>> dc
<xarray.DataArray (z: 6)>
array([0., 1., 2., 2., 1., 0.])
Coordinates:
  * z        (z) MultiIndex
  - dim_0    (z) int64 0 0 0 1 1 1
  - dim_1    (z) int64 0 1 2 0 1 2

>>> dc[dc > 0] += 2
>>> dc
<xarray.DataArray (z: 6)>
array([0., 3., 4., 4., 3., 0.])
Coordinates:
  * z        (z) MultiIndex
  - dim_0    (z) int64 0 0 0 1 1 1
  - dim_1    (z) int64 0 1 2 0 1 2
>>> dc.unstack('z')
<xarray.DataArray (dim_0: 2, dim_1: 3)>
array([[0., 3., 4.],
       [4., 3., 0.]])
Coordinates:
  * dim_0    (dim_0) int64 0 1
  * dim_1    (dim_1) int64 0 1 2 

我仍然需要测试对效率的影响,但在功能上它解决了我的问题。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54789656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档