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

40 投票
5 回答
33559 浏览
提问于 2025-04-16 22:21

我正在处理一些非常大的稀疏矩阵(大小从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()

5 个回答

17

Amos的回答现在已经不需要了。因为Scipy现在内部已经做了类似的处理,如果输入的矩阵是csr或csc格式,并且你想要的输出格式设置为不指定或与输入矩阵相同的话。使用scipy.sparse.vstack可以高效地将csr格式的矩阵竖着叠加,而使用scipy.sparse.hstack则可以高效地将csc格式的矩阵横着叠加。

17

使用hstack、vstack或concat这些方法,速度比直接拼接里面的数据对象要慢很多。原因是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))
56

现在,稀疏库里有了两个新功能,分别是hstackvstack。它们的作用是把矩阵横着和竖着拼接在一起。

撰写回答