使用scipy.sparse.csc_matrix.toarray()将稀疏矩阵转换为数组时出错

时间:2014-06-30 23:39:09

标签: python ubuntu numpy scikit-learn

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

2 个答案:

答案 0 :(得分:3)

您无法在大型稀疏矩阵上调用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。

答案 1 :(得分:-1)

只需删除.toarray,并使用稀疏矩阵作为分类器的输入,它可以正常工作