Как использовать разреженную функциональность xarray при комбинировании массивов разного размера? - PullRequest
0 голосов
/ 07 февраля 2020

Поскольку xarray выдает все более и более разреженные функциональные возможности массива, мне интересно, как добиться следующего:

У меня есть (на самом деле ленивый, не загруженный) массив dask arr_a размера, скажем, 2x1000 и dask массив arr_b размером 2x10:

from dask import array as da
import numpy as np

arr_a = da.from_array(np.random.rand(2, 1000))
arr_b = da.from_array(np.random.rand(2, 10))

Теперь я создаю два xarray DataArrays с «одинаковой», но по-разному выбранной временной осью:

import xarray as xr
import pandas as pd

time1 = pd.timedelta_range(0, periods=1000, freq="ms")/pd.offsets.Second(1)
time2 = pd.timedelta_range(0, periods=10, freq="100ms")/pd.offsets.Second(1)

xr1 = xr.DataArray(arr_a , dims=["cycle", "time"], coords={"time": time1, "cycle": [1,2]}).rename("ch1")
xr2 = xr.DataArray(arr_b , dims=["cycle", "time"], coords={"time": time2, "cycle": [1,2]}).rename("ch2")

xr_data = xr.combine_by_coords([xr1.to_dataset(), xr2.to_dataset()])

После объединения / объединения обоих DataArrays в набор данных, вторая переменная xr2 разрежена и заполнена NaN. Это на самом деле здорово, но каждому NaN нужно место в памяти. Я должен найти способ, эти элементы NaN не нуждаются в памяти.

Возможно ли это? Если да, то как?

Большое спасибо команде xarray и dask за вашу замечательную работу!

1 Ответ

1 голос
/ 28 февраля 2020

Либо:

arr_a = arr_a.map_blocks(sparse.COO)
arr_b = arr_b.map_blocks(sparse.COO)

Или:

xr1 = xarray.apply_ufunc(sparse.COO, xr1, dask="parallelized", output_dtypes=[xr1.dtype])
xr2 = xarray.apply_ufunc(sparse.COO, xr2, dask="parallelized", output_dtypes=[xr1.dtype])

, которые в данном случае эквивалентны.

после преобразования ваших данных в разреженные Вы можете выровнять и объединить.

...