Векторизация выделения по переменной уровня

При построении 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)

Может быть, первый вариант лучше для вашего случая использования.

Другие вопросы по тегам