如何在稀疏的稀疏lil_matrix中存储显式0值?

时间:2018-10-30 21:06:28

标签: python numpy scipy sparse-matrix

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,因为将元素分配给它效率很低。但是,它将存储与lil_matrix不同的显式设置的0值。在上面的代码中,用csr_matrix替换lil_matrix,输出更改为:

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

有人知道如何在lil_matrix对象中存储显式0值吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

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时使用此格式,并有助于从重叠的子矩阵创建矩阵。