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

3 投票
2 回答
4842 浏览
提问于 2025-04-18 11:39

我有一个叫做 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。

撰写回答