Переупорядочение строк и столбцов в матрице CSR - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть матрица в разреженном формате 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))

Это также работает, но попадает в ту же ловушку ошибки памяти для большой разреженной матрицы. Любые предложения, чтобы эффективно сделать это?

1 Ответ

0 голосов
/ 20 февраля 2020

Давайте думать умно.

Вместо того, чтобы переупорядочивать матрицу, почему вы не работаете непосредственно с индексами строк и столбцов, которые вы указали в начале?

Так, например, вы можно заменить индексы строк следующим образом: от

[0, 0, 1, 2, 2, 2]

до:

[2, 2, 0, 1, 1, 1]

И индексов столбцов от:

[0, 2, 2, 0, 1, 2]

до:

[2, 1, 1, 2, 0, 1]
...