Как вы храните явные значения 0 в скудном разреженном lil_matrix? - PullRequest
0 голосов
/ 31 октября 2018

Объекты scipy.sparse.lil_matrix, похоже, не хранят явно установленные значения 0. Другие разреженные матрицы, такие как csr_matrix, делают.

Рассмотрим следующий пример:

In [1]: from scipy.sparse import lil_matrix

In [2]: import numpy as np

In [3]: x = lil_matrix((5, 5), dtype=np.float32)

In [4]: x[3, 3] = 0

In [5]: x
Out[5]:
<5x5 sparse matrix of type '<class 'numpy.float32'>'
        with 0 stored elements in LInked List format>

Это плохо, потому что иногда между элементами графа будет расстояние 0 (например, дубликаты точки данных). Если я передам lil_matrix, например, scipy.sparse.csgraph.connected_components, он обнаружит неправильное количество подключенных компонентов, поскольку явный 0 преобразуется обратно в «разреженность» и поэтому рассматривается как бесконечное расстояние.

Я не могу использовать csr_matrix, потому что очень неэффективно присваивать ему элементы. Тем не менее, он будет хранить явно установленные значения 0 в отличие от lil_matrix. Замените lil_matrix на csr_matrix в приведенном выше коде, и результат изменится на:

<5x5 sparse matrix of type '<class 'numpy.float32'>'
        with 1 stored elements in Compressed Sparse Row format>

Кто-нибудь знает, как хранить явные значения 0 в объектах lil_matrix?

Спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

lil __setitem__ использует скомпилированную функцию lil_fancy_set. Это документы говорят:

In [320]: sparse._csparsetools.lil_fancy_set?
Docstring:
Set multiple items to a LIL matrix.

Checks for zero elements and deletes them.

Parameters
----------
M, N, rows, data
    LIL matrix data
i_idx, j_idx
    Indices of elements to insert to the new LIL matrix.
values
    Values of items to set.
Type:      builtin_function_or_method

csr матрица имеет eliminate_zeros метод:

Signature: M.eliminate_zeros()
Source:   
    def eliminate_zeros(self):
        """Remove zero entries from the matrix

        This is an *in place* operation
        """
        M, N = self._swap(self.shape)
        _sparsetools.csr_eliminate_zeros(M, N, self.indptr, self.indices,
                                         self.data)
        self.prune()  # nnz may have changed
File:      /usr/local/lib/python3.6/dist-packages/scipy/sparse/compressed.py
Type:      method

Он также имеет sum_duplicates метод. Это используется при преобразовании формата coo в csr и облегчает создание матрицы из перекрывающихся подматриц.

...