【问题标题】:How to eliminate zeros in sparse matrix in (Python)?如何在(Python)中消除稀疏矩阵中的零点?
【发布时间】:2015-10-22 07:43:36
【问题描述】:

我需要一个稀疏矩阵(我使用来自scipy.sparseCompressed Sparse Row Format (CSR))来进行一些计算。我以(data, (row, col)) 元组的形式拥有它。不幸的是,一些行和列都​​将为零,我想摆脱那些零。现在我有:

[In]:
     from scipy.sparse import csr_matrix
     aa = csr_matrix((1,2,3), ((0,2,2), (0,1,2))
     aa.todense()
[Out]:
     matrix([[1, 0, 0],
             [0, 0, 0],
             [0, 2, 3]], dtype=int64)

我想拥有:

[Out]:
    matrix([[1, 0, 0],
            [0, 2, 3]], dtype=int64)

在对象上使用eliminate_zeros() 方法后,我得到None

[In]:
     aa2 = csr_matrix.eliminate_zeros(aa)
     type(aa2)
[Out]:
     <class 'NoneType'>

为什么那个方法会把它变成None?

有没有其他方法可以获得稀疏矩阵(不必是 CSR)并轻松摆脱空行/列?

我正在使用 Python 3.4.0。

【问题讨论】:

  • 该方法是否可能在原地运行,并修改了原始aa 变量?然后它不会返回任何东西(即None)。
  • 就地。事实上,它在文档中是这样说的。
  • 这不是 OP 想要做的。它会从.data 中删除不需要的0s,但不会更改尺寸。
  • elminate_zeros 不会改变 aa=sparse.csr_matrix(((1,2,3),((0,2,2),(0,1,2)))),因为它没有多余的 0。

标签: python-3.x scipy sparse-matrix


【解决方案1】:

以csr格式,摆脱全零行相对容易:

>>> import scipy.sparse as sps
>>> a = sps.csr_matrix([[1, 0, 0], [0, 0, 0], [0, 2, 3]])
>>> a.indptr
array([0, 1, 1, 3])
>>> mask = np.concatenate(([True], a.indptr[1:] != a.indptr[:-1]))
>>> mask  # 1st occurrence of unique a.indptr entries
array([ True,  True, False,  True], dtype=bool)
>>> sps.csr_matrix((a.data, a.indices, a.indptr[mask])).A
array([[1, 0, 0],
       [0, 2, 3]])

然后,您可以将稀疏阵列转换为CSC格式,并且完全相同的技巧将摆脱所有零列。

我不确定它的表现如何,但更可读的语法:

>>> a[a.getnnz(axis=1) != 0][:, a.getnnz(axis=0) != 0].A
array([[1, 0, 0],
       [0, 2, 3]])

也有效。

【讨论】:

  • 您的第一个解决方案取决于被修正的数组。根据为什么有0s,它可能需要eliminate_zeros()匹配第二种方法的结果。 span>
猜你喜欢
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2015-04-26
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多