gpt4 book ai didi

python - 重新排序 CSR 矩阵中的行和列

转载 作者:行者123 更新时间:2023-12-05 06:20:43 25 4
gpt4 key购买 nike

例如,我有一个稀疏 csr 格式的矩阵:

from scipy.sparse import csr_matrix
import numpy as np
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
M = csr_matrix((data, (row, col)), shape=(3, 3))
M.A =
array([[1, 0, 2],
[0, 0, 3],
[4, 5, 6]])

我正在使用以下方法对索引为 [2,0,1] 的矩阵重新排序:

order = np.array([2,0,1])
M = M[order,:]
M = M[:,order]
M.A
array([[6, 4, 5],
[2, 1, 0],
[3, 0, 0]])

这种方法可行,但对于我的大小为 16580746 X 1672751804 并导致内存错误的真实 csr_matrix 来说,这是不可行的。我采用了另一种方法:

edge_list = zip(row,col,dat)
index = dict(zip(order, range(len(order))))
all_coeff = zip(*((index[u], index[v],d) for u,v,d in edge_list if u in index and v in index))
new_row,new_col,new_data = all_coeff
n = len(order)
graph = csr_matrix((new_data, (new_row, new_col)), shape=(n, n))

这也有效,但对于大型稀疏矩阵会陷入同样的​​内存错误陷阱。有什么建议可以有效地做到这一点?

最佳答案

我发现使用矩阵运算是最有效的。这是一个将行和/或列排列为指定顺序的函数。如果您愿意,可以修改它以交换两个特定的行/列。

from scipy import sparse

def permute_sparse_matrix(M, new_row_order=None, new_col_order=None):
"""
Reorders the rows and/or columns in a scipy sparse matrix
using the specified array(s) of indexes
e.g., [1,0,2,3,...] would swap the first and second row/col.
"""
if new_row_order is None and new_col_order is None:
return M

new_M = M
if new_row_order is not None:
I = sparse.eye(M.shape[0]).tocoo()
I.row = I.row[new_row_order]
new_M = I.dot(new_M)
if new_col_order is not None:
I = sparse.eye(M.shape[1]).tocoo()
I.col = I.col[new_col_order]
new_M = new_M.dot(I)
return new_M

关于python - 重新排序 CSR 矩阵中的行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60318598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com