是否有高效的方法连接scipy.sparse矩阵?
我正在处理一些非常大的稀疏矩阵(大小从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))