使用sciy . Sparse .csc_matrix.toarray()将稀疏矩阵转换为数组出错



我有一个scipy.sparse。csc_matrix,我想用scipy.sparse.csc_matrix.toarray()变换成数组。当我对一个小数据集使用这个函数时,它工作得很好。但是,当我将它用于大型数据集时,python解释器在调用该函数时立即崩溃,窗口关闭,没有错误消息。我试图转换成数组的矩阵是用sklearn.feature_extraction.text.CountVectorizer创建的。我在Ubuntu 12.04上运行python 2.7.3。更复杂的是,当我试图从终端运行脚本以保存任何错误消息时,日志没有记录任何错误消息,并且确实在脚本中更早地停止(尽管如果不调用toarray()是完整的)。

您不能在大型稀疏矩阵上调用toarray,因为它将尝试将所有值(包括零)显式地存储在连续的内存块中。

举个例子,假设你有一个稀疏矩阵A:

>>> A.shape
(10000, 100000)
>>> A.nnz              # non zero entries
47231
>>> A.dtype.itemsize
8

非零数据的MB大小为:

>>> (A.nnz * A.dtype.itemsize) / 1e6
0.377848

你可以检查这是否匹配稀疏矩阵数据结构的data数组的大小:

>>> A.data / 1e6
0.377848

根据稀疏矩阵数据结构的类型(CSR, CSC, COO…),它还以各种方式存储非零项的位置。一般来说,这会使内存使用量增加一倍。因此,A使用的总内存约为700kB。

转换为连续数组表示将物化内存中的所有零,结果大小将为:

>>> A.shape[0] * A.shape[1] * A.dtype.itemsize / 1e6
8000.0

本例中为8GB,而原始的稀疏表示不到1MB。

只是删除。toarray,并使用稀疏矩阵作为分类器的输入,它工作得很好

相关内容

  • 没有找到相关文章