Как сгладить набор данных xarray в одномерный массив?

Есть ли простой способ уплощения набора данных xarray в одном массиве 1D NumPy?

Например, выравнивание следующего набора тестовых данных:

xr.Dataset({
    'a' : xr.DataArray(
                   data=[10,11,12,13,14],
                   coords={'x':[0,1,2,3,4]},
                   dims={'x':5}
          ),
    'b' : xr.DataArray(data=1,coords={'y':0}),
    'c' : xr.DataArray(data=2,coords={'y':0}),
    'd' : xr.DataArray(data=3,coords={'y':0})
})

в

[10,11,12,13,14,1,2,3]

?

2 ответа

Решение

Если вы в порядке с повторными значениями, вы можете использовать .to_array() а затем сгладить значения в NumPy, например,

>>> ds.to_array().values.ravel()
array([10, 11, 12, 13, 14,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  3,  3,
        3,  3,  3])

Если вам не нужны повторяющиеся значения, вам нужно что-то написать самостоятельно, например,

>>> np.concatenate([v.values.ravel() for v in ds.data_vars.values()])
array([10, 11, 12, 13, 14,  1,  2,  3])

В более общем плане это звучит несколько похоже на предлагаемый интерфейс для "укладки" переменных данных в 2D для приложений машинного обучения: https://github.com/pydata/xarray/issues/1317

По состоянию на июль 2019 года в xarray теперь есть функции to_stacked_array и to_unstacked_dataset, которые выполняют эту функцию.

Получить набор данных из вопроса:

ds = xr.Dataset({
'a' : xr.DataArray(
               data=[10,11,12,13,14],
               coords={'x':[0,1,2,3,4]},
               dims={'x':5}
      ),
'b' : xr.DataArray(data=1,coords={'y':0}),
'c' : xr.DataArray(data=2,coords={'y':0}),
'd' : xr.DataArray(data=3,coords={'y':0})
})

Получить список переменных данных:

variables = ds.data_vars

Использовать np.flatten() Способ уменьшения массивов до 1D:

arrays = [ ds[i].values.flatten() for i in variables ] 

Затем разверните список одномерных массивов (как подробно описано в этом ответе):

arrays = [i for j in arrays for i in j  ]

Теперь преобразуйте это в массив в соответствии с запросом в Q (как текущий список):

array = np.array(arrays)
Другие вопросы по тегам