Вычитание матрицы CSR без уменьшения хранимых элементов - PullRequest
0 голосов
/ 23 апреля 2020

Я имею дело с вычитанием скудных разреженных матриц. К сожалению, если какая-то ячейка после вычитания равна 0, она исчезает.

Я ожидаю, что она будет храниться в элементах, но значение равно нулю.

Некоторые упрощенные примеры:

import scipy.sparse as sparse
import numpy as np
row = np.array([0, 1])
col = np.array([0, 1])
data = np.array([1 ,1])
sample_csr=sparse.csr_matrix((data, (row, col)))
display(sample_csr-sample_csr) # what I have
display(sample_csr*0) # what I want

1 Ответ

0 голосов
/ 23 апреля 2020
In [844]: row = np.array([0, 1]) 
     ...: col = np.array([0, 1]) 
     ...: data = np.array([1 ,1]) 
     ...: sample_csr=sparse.csr_matrix((data, (row, col)))                                             
In [845]: sample_csr                                                                                   
Out[845]: 
<2x2 sparse matrix of type '<class 'numpy.longlong'>'
    with 2 stored elements in Compressed Sparse Row format>
In [846]: _.A                                                                                          
Out[846]: 
array([[1, 0],
       [0, 1]], dtype=int64)

Вычитание 2 матриц возвращает новую матрицу; он не изменяет sample_csr.

In [847]: sample_csr-sample_csr                                                                        
Out[847]: 
<2x2 sparse matrix of type '<class 'numpy.longlong'>'
    with 0 stored elements in Compressed Sparse Row format>

Вы можете изменить data матрицы на месте

In [848]: sample_csr=sparse.csr_matrix((data, (row, col)))                                             
In [849]: sample_csr.data *= 0                                                                         
In [850]: sample_csr                                                                                   
Out[850]: 
<2x2 sparse matrix of type '<class 'numpy.longlong'>'
    with 2 stored elements in Compressed Sparse Row format>

Фактически, для эффективности sparse.csr позволяет количество изменений без выяснения новой редкости. Вы можете даже получить предупреждение об эффективности, если попытаетесь сделать что-то, требующее изменения разреженности (например, добавление ненулевого значения).

И очистить разреженность после последовательности операций:

In [851]: sample_csr.eliminate_zeros()                                                                 
In [852]: sample_csr                                                                                   
Out[852]: 
<2x2 sparse matrix of type '<class 'numpy.longlong'>'
    with 0 stored elements in Compressed Sparse Row format>

Я не знаю, как сохранить 0, как вы хотите. Предположительно это потребовало бы глубоких изменений в том, как он отслеживает разреженность обоих операндов.

Разреженные матрицы, особенно формат csr, оптимизированы для умножения матриц. Другая математика, как поэлементное сложение и вычитание, намного медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...