【问题标题】:Build large scipy sparse matrix构建大型 scipy 稀疏矩阵
【发布时间】:2017-02-17 14:04:12
【问题描述】:

构建 scipy 稀疏矩阵的最佳方法之一是使用 coo_matrix 方法,即。

coo_matrix((data, (i, j)), [shape=(M, N)])

where:
data[:] are the entries of the matrix, in any order
i[:] are the row indices of the matrix entries
j[:] are the column indices of the matrix entries

但是,如果矩阵非常大,将整个 i、j 和数据向量加载到内存中是不切实际的。

你如何构建一个 coo_matrix 使得 (data, (i, j)) 由磁盘提供(使用迭代器或生成器)并且磁盘上的数组/向量对象是 .npy 或 pickle 格式?

Pickle 是更好的选择,因为 numpy.save/load 没有针对 scipy sparse 进行优化。也许还有另一种更快的格式。

numpy.genfromtext() 和 numpy.loadtxt() 都很笨重、速度慢且占用内存。

【问题讨论】:

    标签: scipy sparse-matrix


    【解决方案1】:

    我不太明白。如果i, j, data 数组太大而无法创建或加载到内存中,那么它们太大而无法创建稀疏矩阵。

    如果这三个数组有效,则生成的稀疏矩阵将使用它们作为相应的属性,无需应对或更改。从coo 构造的csr 矩阵可能更紧凑一些,因为它的indptr 数组每行有一个值。 dataindices 数组的大小将与 coo 相同(给出或接受给定的重复项和排序)。

    doklil 格式可用于增量矩阵创建,但从长远来看它们不会节省内存。两者仍然必须为每个非零数据点输入一个条目。在lil 的情况下,您将拥有一堆列表;而dok 是一个真正的字典。

    没有一种稀疏格式是“虚拟的”,而是根据需要“即时”创建元素。

    如果它们的总大小太大,我看不出加载 3 个定义数组的各种方法有何帮助。

    In [782]: data=np.ones((10,),int)
    In [783]: rows=np.arange(10)
    In [784]: cols=np.arange(10)
    In [785]: M=sparse.coo_matrix((data,(rows,cols)))
    In [786]: M.data
    Out[786]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    In [787]: M.data is data
    Out[787]: True
    In [789]: M.col is cols
    Out[789]: True
    

    基本上coo 格式是存储这三个数组的一种方式。真正的工作,所有的数学运算、求和,甚至索引,都是使用csr 格式执行的。

    【讨论】:

    • 使用您的示例创建 coo_matrix,内存包含对象数据、行、列和 M。问题是是否可以使用流式行、列和数据增量创建 coo_matrix。您的回答表明这是不可能的。
    • __init__coo_matrix 代码是用 Python 编写的,易于理解。 bmat 的代码,它从块构建 coo 矩阵也将是有启发性的。
    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2017-03-31
    • 2020-05-31
    • 1970-01-01
    • 2021-09-22
    • 2017-03-26
    • 2023-04-10
    相关资源
    最近更新 更多