jon*_*nes 34 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()
Run Code Online (Sandbox Code Playgroud)
jon*_*nes 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]) )
Run Code Online (Sandbox Code Playgroud)
Joe*_*eau 13
不再需要Amos的答案.如果输入矩阵是csr或csc格式,并且所需的输出格式设置为none或与输入矩阵的格式相同,则Scipy现在会在内部执行类似的操作.使用scipy.sparse.vstack
或scipy.sparse.hstack
分别以csr格式垂直堆叠矩阵或以csc格式水平堆栈矩阵是有效的.
Amo*_*mos 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))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24980 次 |
最近记录: |