我需要一个稀疏矩阵(我使用scipy.sparse
中的Compressed 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'>
为什么该方法将其变为无?
有没有其他方法可以获得稀疏矩阵(不必是CSR)并轻松摆脱空行/列?
我使用的是Python 3.4.0。
答案 0 :(得分:3)
在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]])
也有效。