我正在使用一些相当大的稀疏矩阵(从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()
答案 0 :(得分:49)
答案 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.vstack
或scipy.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))