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()
。
描述
我需要从 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()
。