2011-07-27 44 views
26

我正在处理一些相当大的稀疏矩阵(从5000x5000到20000x20000),并且需要找到一种有效的方式来以灵活的方式连接矩阵,以便从单独的部分构造随机矩阵。是否有连接scipy.sparse矩阵的有效方法?

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

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() 

回答

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])) 
+1

感谢您回复并评论您是如何快速完成的。我需要它用于我的NLP课程。 – placeybordeaux

42

稀疏库现在具有hstackvstack分别用于水平和垂直方向串联矩阵。

+1

确保您使用scipy.sparse.hstack而不是numpy.hstack – 0111001101110000

9

使用hstack,vstack或concatenate比连接内部数据对象本身慢得多。原因在于,hstack/vstack将稀疏矩阵转换为coo格式,当矩阵非常大而非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)) 
+1

只是在寻找将新行追加到CSR矩阵的快速方式。这正是我需要的。谢谢@amos。 – singleton

+0

如果你使用这种方法,你需要在'return csc_matrix((new_data,new_indices,new_ind_ptr)')中指定形状,例如:'return csc_matrix((new_data,new_indices,new_ind_ptr),shape =(matrix1.shape [1], matrix1.shape [1] + matrix2.shape [1])' – simeon

4

阿莫斯的回答不再是必要的。如果输入矩阵采用csr或csc格式,并且所需的输出格式设置为无或输入矩阵的格式相同,现在Scipy在内部执行类似于此操作的操作。以csr格式垂直堆叠矩阵或以csc格式水平堆叠矩阵是有效的,分别使用scipy.sparse.vstackscipy.sparse.hstack

+0

“now”是指哪个版本?是否有任何参考? – lenz

+0

相关代码是[this snippet](https://github.com) /scipy/scipy/blob/master/scipy/sparse/construct.py#L552)from'scipy.sparse.bmat','vstack'和'hstack'都使用。这个hack最初被添加到[here](https: //github.com/scipy/scipy/commit/10b2cbdc980c6e1695c732c90fba99f722437171)在2013年,它看起来像它最初包含在scipy 1.0.0 –

+0

谢谢!Scipy 1.0.0仍处于RC阶段,但... – lenz