Python 如何利用xarray';在组合不同大小的dask阵列时,是否具有稀疏功能?

Python 如何利用xarray';在组合不同大小的dask阵列时,是否具有稀疏功能?,python,sparse-matrix,dask,python-xarray,Python,Sparse Matrix,Dask,Python Xarray,随着xarray推出越来越多的稀疏阵列功能,我想知道如何实现以下目标: 我有一个大小为2x1000的dask数组(实际上是惰性的,未加载) 和一个大小为2x10的dask阵列arr_b: 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推出越来越多的稀疏阵列功能,我想知道如何实现以下目标:

我有一个大小为2x1000的dask数组(实际上是惰性的,未加载) 和一个大小为2x10的dask阵列arr_b:

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数据阵列:

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()])
将/mergin两个数据数组组合到一个数据集中后,第二个变量xr2是稀疏的,并用NAN填充。这实际上很棒,但每个NaN都需要内存空间。 我得想办法,这些东西不需要记忆

可能吗?如果是,如何进行

非常感谢xarray和dask团队的出色工作

或者:

arr\u a=arr\u a.map\u块(sparse.COO)
arr_b=arr_b.map_块(sparse.COO)
或:

xr1=xarray.apply_ufunc(sparse.COO,xr1,dask=“parallelized”,output_dtypes=[xr1.dtype])
xr2=xarray.apply_ufunc(sparse.COO,xr2,dask=“parallellelized”,输出类型=[xr1.dtype])
在这种情况下,它们是等价的


将数据转换为稀疏后,可以对齐和合并。

很抱歉初始复制代码错误。上面的代码使用最新的xarray(0.15)和最新的dask(2.10.1)模块。不幸的是,在合并/对齐稀疏数据后,生成的xarray再次显示为非稀疏。然而,在
xarray.apply_ufunc(sparse.COO,…)
再次应用于结果合并/对齐的xarray之后,新的xarray仍然非常大。当dask中的数据来自一个惰性定义的hdf5文件时,pickle对齐了xarray,它显然只在pickle中保存数据,而不是惰性定义图。我猜这是一个dask问题?!你一定做错了什么。实际上,您不可能意外地使稀疏数组再次出现;除非显式为其设置环境变量,否则稀疏将崩溃(请参阅稀疏文档)。默认情况下,sparse.COO的填充值为0。对齐时,xarray将NaN作为填充值。因此,需要使用fill value=NaN调用sparse.COO。按照设计,酸洗一个延迟加载的NetCDF文件将急切地将其加载到pickle中。结果将是数据集的所有相关块加上lazy dask指令,以将其转换为最终数组。我会把它贴在这里和github上。谢谢你在这里帮助我!