将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 扩展。

以上是关于将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中的主要内容,如果未能解决你的问题,请参考以下文章

如何将 numpy.matrix 或数组转换为 scipy 稀疏矩阵

如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

python使用scipy中的sparse.csr_matrix函数将numpy数组转化为稀疏矩阵(Create A Sparse Matrix)

SciPy NumPy 和 SciKit-learn ,创建一个稀疏矩阵

scipy稀疏矩阵和numpy数组之间的点积给出ValueError