Xarray:处理通过索引一个元素返回的无量纲数组的简洁方法

Xarray: Clean way to deal with dimensionless arrays returned by indexing one element

描述

我需要从 xarray.DataArray 中取出一个值。我得到的是一个数组——没有维度——包含值。如何直接获取值?

returned 数组不能被索引,但是大多数 numpy 方法都可以使用它。然而,在某些情况下,我需要的不是数组形式的值,而是它自己键入的值。

例子

我想做如下事情:

In [1]: import xarray as xr       

In [2]: d = xr.DataArray([list('abc'), list('def')], 
   ...:                  coords=[[1, 2], list('abc')])

In [3]: d.sel(dict(dim_0=1, dim_1='a')).upper()  # What I'd like to do.                   
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-6d58c154742f> in <module>
----> 1 d.sel(dict(dim_0=1, dim_1='a')).upper()

~/.local/lib/python3.7/site-packages/xarray/core/common.py in __getattr__(self, name)
    181                     return source[name]
    182         raise AttributeError("%r object has no attribute %r" %
--> 183                              (type(self).__name__, name))
    184 
    185     def __setattr__(self, name: str, value: Any) -> None:

AttributeError: 'DataArray' object has no attribute 'upper'

这也不行:

In [4]: d.sel(dict(dim_0=1, dim_1='a')).values.upper()              
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-85757efcdeeb> in <module>
----> 1 d.sel(dict(dim_0=1, dim_1='a')).values.upper()

AttributeError: 'numpy.ndarray' object has no attribute 'upper'

什么有效,但我需要为此建立位置索引:

In [5]: d.values[0, 0].upper()    
Out[5]: 'A'

还有(有点冗长):

In [6]: d.sel(dict(dim_0=1, dim_1='a')).values.flatten()[0].upper()
Out[6]: 'A'

预期结果

在这种情况下不应该 xarray return 普通值,就像 numpy 一样?

或者只有一个值的数组,但是所有维度, 可以按位置索引:

In [7]: d.sel(dict(dim_0=1, dim_1='a'))
Out[7]:
<xarray.DataArray (dim_0: 1, dim_1: 1)>
array([[1]])
Coordinates:
  * dim_0    (dim_0) int64 1
  * dim_1    (dim_1) <U1 'a'

您认为处理这种情况最干净的方法是什么?非常感谢!

感谢您提出明确的问题。

您可以通过 .item():

获取标量
In [1]: In [1]: import xarray as xr
   ...:
   ...: In [2]: d = xr.DataArray([list('abc'), list('def')],
   ...:    ...:                  coords=[[1, 2], list('abc')])
   ...:

In [2]: d
Out[2]:
<xarray.DataArray (dim_0: 2, dim_1: 3)>
array([['a', 'b', 'c'],
       ['d', 'e', 'f']], dtype='<U1')
Coordinates:
  * dim_0    (dim_0) int64 1 2
  * dim_1    (dim_1) <U1 'a' 'b' 'c'

In [3]: x = d.sel(dict(dim_0=1, dim_1='a'))

In [4]: x
Out[4]:
<xarray.DataArray ()>
array('a', dtype='<U1')
Coordinates:
    dim_0    int64 1
    dim_1    <U1 'a'

In [5]: x.item()
Out[5]: 'a'

Xarray always returns 来自索引方法的数组,以便用户可以推断其代码中的类型。否则,例如,如果基础数据发生变化,您可能会发现自己在标量上调用 .sum()