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

标签 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() 未被调用)。

最佳答案

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

关于python - 使用 scipy.sparse.csc_matrix.toarray() 将稀疏矩阵转换为数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24500484/

相关文章:

python - 测试套件单元测试

java - 在 Ubuntu 中使用多个版本的 Java

bash - 如何使用 "grep"命令列出当前目录中用户可执行的所有文件?

python - 描述时间序列 Pandas 中的差距

python - 合并第 i^{th} 轴之前和之后的轴

python - Numba 元组切片问题 - 整数除外

python - 发送多封电子邮件时如何识别收件人电子邮件不正确

python - Google 云端硬盘日期格式?

python - WebDriverWait 预期条件中的逻辑运算符

linux - 我在哪里可以为 Docker 容器配置启动用户 UID?