我有一个scipy.sparse.csc_matrix http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csc_matrix.html我正在尝试将其转换为数组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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)