使用scipy.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()
之前就停止了,尽管如果不调用这个方法,脚本是可以完整运行的。
2 个回答
-1
只需要去掉 .toarray,然后直接把稀疏矩阵作为分类器的输入,这样就可以正常工作了。
3
你不能在一个大的稀疏矩阵上调用 toarray
,因为它会试图把所有的值(包括零)都存储在一块连续的内存中。
我们来举个例子,假设你有一个稀疏矩阵 A:
>>> A.shape
(10000, 100000)
>>> A.nnz # non zero entries
47231
>>> A.dtype.itemsize
8
非零数据的大小是:
>>> (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。