Как сгладить набор данных 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)