我正在使用sparse构造、存储和读取一个大型稀疏矩阵。我想使用Dask数组来使用它的阻塞算法特性。
这是我正在尝试做的事情的一个简化版本:
file_path = './{}'.format('myfile.npz')
if os.path.isfile(file_path):
# Load file with sparse matrix
X_sparse = sparse.load_npz(file_path)
else:
# All matrix elements are initially equal to 0
coords, data = [], []
X_sparse = sparse.COO(coords, data, shape=(88506, 1440000))
# Create file for later retrieval
sparse.save_npz(file_path, X_sparse)
# Create Dask array from matrix to allow usage of blocked algorithms
X = da.from_array(X_sparse, chunks='auto').map_blocks(sparse.COO)
return X
不幸的是,当尝试将compute()
与X
一起使用时,上面的代码抛出了以下错误:Cannot convert a sparse array to dense automatically. To manually densify, use the todense method.
;但我不能将稀疏矩阵转换为内存中的密集矩阵,因为这将导致错误。
对于如何实现这一点有什么想法吗?
发布于 2019-06-06 17:30:00
您可以查看以下问题:https://github.com/dask/dask/issues/4523
基本上,sparse
故意防止自动转换为密集矩阵。但是,通过设置环境变量SPARSE_AUTO_DENSIFY=1
,您可以覆盖此行为。尽管如此,这只解决了bug,但不能实现您的主要目标。
您需要做的是将文件拆分为多个*.npz稀疏矩阵,以延迟的方式使用sparse
加载这些矩阵(请参阅dask.delayed),然后将这些矩阵连接成一个大型稀疏Dask数组。
在不久的将来,我将不得不实现类似的东西。我想这应该是Dask原生支持的.
https://stackoverflow.com/questions/54788436
复制相似问题