是否有一种连接scipy.sparse矩阵的有效方法?

时间:2011-07-27 13:20:09

标签: python concatenation scipy sparse-matrix

我正在使用一些相当大的稀疏矩阵(从5000x5000到20000x20000)并且需要找到一种以灵活方式连接矩阵的有效方法,以便从不同的部分构造随机矩阵。

现在我正在使用以下方法连接四个矩阵,但它的效率非常低。有没有更好的方法可以做到这一点,不涉及转换为密集矩阵?

rmat[0:m1.shape[0],0:m1.shape[1]] = m1
rmat[m1.shape[0]:rmat.shape[0],m1.shape[1]:rmat.shape[1]] = m2
rmat[0:m1.shape[0],m1.shape[1]:rmat.shape[1]] = bridge
rmat[m1.shape[0]:rmat.shape[0],0:m1.shape[1]] = bridge.transpose()

4 个答案:

答案 0 :(得分:49)

稀疏库现在有hstackvstack,分别用于水平和垂直连接矩阵。

答案 1 :(得分:14)

好的,我找到了答案。使用scipy.sparse.coo_matrix比使用lil_matrix要快得多。我将矩阵转换为coo(无痛和快速),然后在添加正确的填充后连接数据,行和列。

data = scipy.concatenate((m1S.data,bridgeS.data,bridgeTS.data,m2S.data))
rows = scipy.concatenate((m1S.row,bridgeS.row,bridgeTS.row + m1S.shape[0],m2S.row + m1S.shape[0]))
cols = scipy.concatenate((m1S.col,bridgeS.col+ m1S.shape[1],bridgeTS.col ,m2S.col + m1S.shape[1])) 

scipy.sparse.coo_matrix((data,(rows,cols)),shape=(m1S.shape[0]+m2S.shape[0],m1S.shape[1]+m2S.shape[1]) )

答案 2 :(得分:13)

不再需要Amos的答案。如果输入矩阵是csr或csc格式,并且所需的输出格式设置为none或与输入矩阵的格式相同,则Scipy现在会在内部执行类似的操作。使用scipy.sparse.vstackscipy.sparse.hstack分别以csr格式垂直堆叠矩阵或以csc格式水平堆叠矩阵非常有效。

答案 3 :(得分:11)

使用hstack,vstack或concatenate比连接内部数据对象本身要慢得多。原因是hstack / vstack将稀疏矩阵转换为coo格式,当矩阵非常大而不是铜格式时,这种格式可能非常慢。这是连接csc矩阵的代码,类似的方法可以用于csr矩阵:

def concatenate_csc_matrices_by_columns(matrix1, matrix2):
    new_data = np.concatenate((matrix1.data, matrix2.data))
    new_indices = np.concatenate((matrix1.indices, matrix2.indices))
    new_ind_ptr = matrix2.indptr + len(matrix1.data)
    new_ind_ptr = new_ind_ptr[1:]
    new_ind_ptr = np.concatenate((matrix1.indptr, new_ind_ptr))

    return csc_matrix((new_data, new_indices, new_ind_ptr))