【问题标题】:Load sparse scipy matrix into existing numpy dense matrix将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中
【发布时间】:2012-02-20 21:51:51
【问题描述】:

假设我有一个巨大的 numpy 矩阵 A 占用数十 GB。分配此内存需要花费不可忽略的时间。

假设我还有一组 scipy 稀疏矩阵,它们的维度与 numpy 矩阵相同。有时我想将这些稀疏矩阵之一转换为密集矩阵以执行一些向量化操作。

我可以将这些稀疏矩阵之一加载到 A 中,而不是每次我想将稀疏矩阵转换为密集矩阵时重新分配空间吗? scipy 稀疏矩阵上可用的 .toarray() 方法似乎没有采用可选的密集数组参数,但也许还有其他方法可以做到这一点。

【问题讨论】:

    标签: python numpy scipy numerical-computing


    【解决方案1】:

    如果稀疏矩阵是COO格式:

    def assign_coo_to_dense(sparse, dense):
        dense[sparse.row, sparse.col] = sparse.data
    

    如果是CSR格式:

    def assign_csr_to_dense(sparse, dense):
        rows = sum((m * [k] for k, m in enumerate(np.diff(sparse.indptr))), [])
        dense[rows, sparse.indices] = sparse.data
    

    为了安全起见,您可能希望在上述每个函数的开头添加以下行:

    assert sparse.shape == dense.shape
    dense[:] = 0
    

    【讨论】:

      【解决方案2】:

      似乎应该有更好的方法来做到这一点(我还没有仔细阅读文档),但你总是可以遍历稀疏数组的元素并分配给密集数组(可能会将密集阵列优先)。如果这最终太慢,那似乎是一个易于编写的 C 扩展......

      【讨论】:

      • 事实证明,将每个稀疏数组转换为密集数组(每次都涉及分配大量内存)比循环遍历稀疏数组的所有元素并将元素加载到预先分配的密集数组。我没有尝试编写 C 扩展。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2021-03-17
      • 1970-01-01
      • 2013-05-06
      相关资源
      最近更新 更多