Ошибка памяти разреженной матрицы
У меня скудная матрица 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>