沿水平变量的矢量化选择

时间:2018-09-19 19:00:55

标签: python python-xarray

构建DataArray时,我可以方便地沿某个坐标进行选择:

import xarray as xr

d = xr.DataArray([1, 2, 3],
                 coords={'c': ['a', 'b', 'c']},
                 dims=['c'])
d.sel(c='a')

,甚至沿着该坐标上的多个值:

d.sel(c=['a', 'b'])

但是,一旦坐标成为多索引维度的一部分,此操作将无法正常工作

d = xr.DataArray([1, 2, 3],
                 coords={'c': ('multi_index', ['a', 'b', 'c']), 
                         'd': ('multi_index', ['x', 'y', 'z'])},
                 dims=['multi_index'])
d.sel(c='a')  # error
d.sel(c=['a', 'b'])  # error

,错误为ValueError: dimensions or multi-index levels ['c'] do not exist。 我在尝试执行此操作时看到的另一个错误消息是ValueError: Vectorized selection is not available along level variable。 似乎只能沿尺寸进行选择。 当单个维度包含大量元数据并且仅希望基于单个元数据坐标的值进行选择时,这将变得困难。

是否有建议的解决方法,而不是手动定位索引?

1 个答案:

答案 0 :(得分:1)

In [8]: d.swap_dims({'multi_index': 'c'}).sel(c=['a', 'b']) Out[8]: <xarray.DataArray (c: 2)> array([1, 2]) Coordinates: * c (c) <U1 'a' 'b' d (c) <U1 'a' 'b' 采取了一些解决方法。

MultiIndex

其中“ c”成为维度而不是“ multi_index”。

如果您想基于'c'和'd'进行随机选择,则使用set_index可能是合适的。 In [12]: d.set_index(cd=['c', 'd']) Out[12]: <xarray.DataArray (multi_index: 3)> array([1, 2, 3]) Coordinates: * cd (cd) MultiIndex - c (cd) object 'a' 'b' 'c' - d (cd) object 'a' 'b' 'c' Dimensions without coordinates: multi_index In [13]: d.set_index(cd=['c', 'd']).sel(c='b') Out[13]: <xarray.DataArray (multi_index: 3)> array([1, 2, 3]) Coordinates: * d (d) object 'b' Dimensions without coordinates: multi_index 这样做

ValueError: Vectorized selection is not available along level variable

但是,MultiIndex尚不支持矢量化选择, (它将抱怨echo '<tr> <td scope="row">' . $row["titled"]. '</td> <td> '.$row["firstname"] .'</td> <td><a href="user_delete.php? delete='.$row["user_id"].'">Delete</a> </td> </tr>'

也许第一种选择更适合您的用例。