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

1 投票
2 回答
1030 浏览
提问于 2025-04-17 11:16

假设我有一个很大的numpy矩阵A,占用了好几十个GB的内存。分配这么多内存需要花费不少时间。

我还有一组和这个numpy矩阵大小相同的scipy稀疏矩阵。有时候,我想把其中一个稀疏矩阵转换成密集矩阵,以便进行一些向量化的操作。

我能不能把这些稀疏矩阵直接加载到A里,而不是每次都重新分配内存来转换稀疏矩阵为密集矩阵呢?scipy稀疏矩阵上的.toarray()方法似乎不支持传入一个已有的密集数组作为参数,但也许还有其他方法可以做到这一点。

2 个回答

1

看起来应该有更好的方法来做到这一点(我也没有仔细查文档),不过你可以遍历稀疏数组里的元素,然后把它们赋值给密集数组(可能需要先把密集数组清零)。如果这样做速度太慢,那写个简单的C语言扩展也不难……

2

如果稀疏矩阵是以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

撰写回答