У меня есть матрица в разреженном формате 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]])
Этот подход работает, но он не осуществим для моего реального csr_matrix, который имеет размер 16580746 X 1672751804
и вызывает ошибку памяти. Я выбрал другой подход, подобный этому:
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))
Это также работает, но попадает в ту же ловушку ошибки памяти для большой разреженной матрицы. Любые предложения, чтобы эффективно сделать это?