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

Python 使用scipy.Sparse.csc_Matrix.toarray()将稀疏矩阵转换为数组时出错,python,ubuntu,numpy,scikit-learn,Python,Ubuntu,Numpy,Scikit Learn,我有一个问题,我正试图用scipy.sparse.csc\u matrix.toarray()将其转换为一个数组。当我对一个小数据集使用该函数时,它工作得很好。但是,当我将其用于大型数据集时,python解释器会在调用该函数时立即崩溃,并且窗口会在没有错误消息的情况下关闭。我试图转换为数组的矩阵是用sklearn.feature\u extraction.text.CountVectorizer创建的。我正在Ubuntu 12.04上运行python 2.7.3。更复杂的是,当我试图从终端运行脚

我有一个问题,我正试图用
scipy.sparse.csc\u matrix.toarray()
将其转换为一个数组。当我对一个小数据集使用该函数时,它工作得很好。但是,当我将其用于大型数据集时,python解释器会在调用该函数时立即崩溃,并且窗口会在没有错误消息的情况下关闭。我试图转换为数组的矩阵是用
sklearn.feature\u 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
您可以检查它是否与稀疏矩阵数据结构的
数据
数组的大小匹配:

>>> 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,并使用稀疏矩阵作为分类器的输入,它工作正常

如果保存CSC矩阵的变量名为
mat
,您能打印
mat.shape
mat.nnz
并在此处共享吗?了解您的系统正在运行的
scipy
numpy
的版本也可能相关。这是一个版本问题
scipy
0.9不起作用,升级到0.14就成功了。我解决了问题,这是scipy的版本问题。有趣的是,当我按照你的建议
A.shape[0]*A.shape[1]*A.dtype.itemsize/1e6
计算内存需求时,我得到的内存略低于27000或27GB。然而,在一台只有16GB内存的计算机上,
a.toarray()
工作并立即执行。
a.toarray().nbytes/1e6
返回什么?它返回完全相同的值。这真奇怪,调用
toarray()
时应该使用27GB或崩溃。