Ошибка памяти разреженной матрицы

У меня скудная матрица csr:

<681881x58216 sparse matrix of type '<class 'numpy.int64'>'
    with 2867209 stored elements in Compressed Sparse Row format>

И я хочу создать новую разреженную матрицу в виде среза csr:csr_2 = csr[1::2,:],

Проблема: когда у меня есть csr только матрица, оперативная память моего сервера занята 40 ГБ. Когда я бегу csr_2 = csr[1::2,:]ОЗУ моего сервера полностью сбрасывается на 128 ГБ и падает с ошибкой памяти.

1 ответ

Решение

sparse использует матричное умножение для выбора таких строк. Я разработал детали extractor матрица в другом вопросе SO, но примерно, чтобы получить (p, n) матрицу из (m, n), необходимо использовать матрицу (p, m) (с p ненулевые значения).

Матричное умножение само по себе является двухпроходным процессом. Первый проход определяет размер получаемой матрицы.

В отличие от плотного numpy массивы, разреженная матричная нарезка никогда не возвращает представление.

Разреженная матричная нарезка с использованием списка int

имеет подробную информацию о матрице экстрактора. Я также предлагаю тестирование csr.sum(axis=1), так как это тоже использует матричное умножение.


def extractor(indices, N):
   indptr=np.arange(len(indices)+1)
   data=np.ones(len(indices))
   shape=(len(indices),N)
   return sparse.csr_matrix((data,indices,indptr), shape=shape)

Таким образом, для индексации каждой второй строки требуется:

In [99]: M = sparse.random(100,80,.1, 'csr')
In [100]: M
Out[100]: 
<100x80 sparse matrix of type '<class 'numpy.float64'>'
    with 800 stored elements in Compressed Sparse Row format>
In [101]: E = extractor(np.r_[1:100:2],100)
In [102]: E
Out[102]: 
<50x100 sparse matrix of type '<class 'numpy.float64'>'
    with 50 stored elements in Compressed Sparse Row format>
In [103]: M1 = E*M
In [104]: M1
Out[104]: 
<50x80 sparse matrix of type '<class 'numpy.float64'>'
    with 407 stored elements in Compressed Sparse Row format>
Другие вопросы по тегам