numpy - scipy 稀疏矩阵:删除所有元素均为零的行

我有一个从sklearn tfidfVectorier转换来的稀疏矩阵,有些行都是零行,我要删除它们。

从稀疏矩阵中删除所有零行有什么简单的方法?

例子:我现在拥有的(实际上以稀疏格式):


[ [0, 0, 0]
 [1, 0, 2]
 [0, 0, 1] ]

我想得到的是:


[ [1, 0, 2]
 [0, 0, 1] ]

时间:

没有现有的函数,但是编写你自己的函数挺容易:


def remove_zero_rows(M):
 M = scipy.sparse.csr_matrix(M)

首先,将矩阵转换为CSR (压缩的稀疏行)格式,这很重要,因为CSR矩阵存储(data, indices, indptr),data存储非零值,indices存储列索引信息,文档解释得更好:

行i的列索引存储在indices[indptr[i]:indptr[i+1]]中,它们对应的值存储在data[indptr[i]:indptr[i+1]]中。

因此,要查找没有非零值的行,我们可以查看M.indptr的连续值,


 num_nonzeros = np.diff(M.indptr)
 return M[num_nonzeros != 0]

CSR格式的第二个好处是切片行比较快,这简化了生成矩阵。

我自己找到了另一个解决方案,


def remove_zero_rows(X)
 # X is a scipy sparse matrix. We want to remove all zero rows from it
 nonzero_row_indice, _ = X.nonzero()
 unique_nonzero_indice = numpy.unique(nonzero_row_indice)
 return X[unique_nonzero_indice]

...