Векторизация выделения по переменной уровня
При построении 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 ответ
swap_dims
делает какое-то решение.
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'
где "c" становится измерением вместо "multi_index".
Если вы хотите выбрать на основе 'c' и 'd' случайным образом, использование MultiIndex
может быть уместно. 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
Однако векторизованный выбор еще не поддерживается для MultiIndex (он будет жаловаться ValueError: Vectorized selection is not available along level variable
)
Может быть, первый вариант лучше для вашего случая использования.