2012-01-27 166 views
1

说我有一个巨大的numpy矩阵A占用数十千兆字节。分配此内存需要花费不可忽视的时间。加载到现有的numpy密集矩阵稀疏scipy矩阵

假设我也有一个与numpy矩阵具有相同尺寸的scipy稀疏矩阵的集合。有时我想将这些稀疏矩阵之一转换为稠密矩阵来执行一些向量化操作。

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

回答

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

看起来好像应该有更好的方法来做到这一点(而且我还没有研究过文档),但是你总是可以遍历稀疏数组的元素并分配给密集数组(可能归零首先密集阵列)。如果这最终过于缓慢,这似乎是一个简单的C扩展编写....

+1

它TU发现将每个稀疏数组转换为一个密集数组(每次分配大量内存)要比遍历稀疏数组的所有元素并将元素加载到预先分配的密集数组更快。我没有尝试写C扩展。 – conradlee 2012-01-30 12:21:28