【问题标题】:Error Converting Sparse Matrix to Array with scipy.sparse.csc_matrix.toarray()使用 scipy.sparse.csc_matrix.toarray() 将稀疏矩阵转换为数组时出错
【发布时间】:2014-06-30 23:39:09
【问题描述】:

我有一个scipy.sparse.csc_matrix,我正在尝试将其转换为带有scipy.sparse.csc_matrix.toarray() 的数组。当我将该函数用于小型数据集时,它可以正常工作。但是,当我将它用于大型数据集时,python 解释器在调用该函数时立即崩溃,并且窗口关闭且没有错误消息。我试图转换为数组的矩阵是用sklearn.feature_extraction.text.CountVectorizer 创建的。我在 Ubuntu 12.04 上运行 python 2.7.3。更复杂的是,当我尝试从终端运行脚本以保存任何错误消息时,日志不会记录任何错误消息,并且确实在脚本中更早地停止(尽管如果未调用 toarray() 则已完成)。

【问题讨论】:

  • 如果保存你的 CSC 矩阵的变量名为mat,你能打印mat.shapemat.nnz 并在这里分享吗?了解您的系统正在运行的scipynumpy 的版本也可能是相关的。
  • 这是一个版本问题。 scipy 0.9 不起作用,更新到 0.14 就可以了。

标签: python ubuntu numpy scikit-learn


【解决方案1】:

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

【讨论】:

  • 我发现了问题,这是 scipy 的版本问题。有趣的是,当我按照你的建议 A.shape[0] * A.shape[1] * A.dtype.itemsize / 1e6 计算内存需求时,我得到的内存略低于 27000 或 27GB。然而,在只有 16GB RAM 的计算机上,A.toarray() 可以立即工作和执行。
  • 那么A.toarray().nbytes / 1e6 会返回什么?
  • 返回完全相同的值。
  • 这真的很奇怪,它应该使用 27GB 或调用 toarray() 时崩溃。
  • 当我尝试使用 toarray() 将稀疏矩阵转换为数组时,我的 Google colab 会话总是崩溃。看起来在计算机内存管理上可能会处理大型稀疏矩阵,但在 Google colab 上并非如此。
【解决方案2】:

只需删除.toarray,并使用稀疏矩阵作为分类器的输入,就可以了

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2021-11-25
    • 2017-07-02
    • 2014-09-08
    • 2023-04-05
    • 1970-01-01
    • 2018-05-30
    • 2013-10-03
    • 2017-08-30
    相关资源
    最近更新 更多