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

时间:2012-01-27 23:03:47

标签: python numpy scipy numerical-computing

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

假设我也有一组与numpy矩阵具有相同维度的scipy稀疏矩阵。有时我想将这些稀疏矩阵中的一个转换为密集矩阵来执行一些矢量化操作。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

看起来应该有更好的方法来做到这一点(我没有搜索过文档),但是你总是可以循环遍历稀疏数组的元素并分配给密集数组(可能会将其归零)密集阵列第一)。如果这结果太慢,那么这似乎是一个简单的C扩展来写....