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