[英]scipy sparse matrix: remove the rows whose all elements are zero
我有一个稀疏矩阵,它是从sklearn tfidfVectorier转换而来的。 我相信有些行是全零行。 我想删除它们。 但是,据我所知,现有的内置函数,例如nonzero()和eliminate_zero(),专注于零条目而不是行。
有没有简单的方法从稀疏矩阵中删除全零行?
示例:我现在拥有的(实际上是稀疏格式):
[ [0, 0, 0]
[1, 0, 2]
[0, 0, 1] ]
我想得到什么:
[ [1, 0, 2]
[0, 0, 1] ]
切片+ getnnz()
可以解决问题:
M = M[M.getnnz(1)>0]
直接在csr_array
上csr_array
。 您也可以删除所有0列而不更改格式:
M = M[:,M.getnnz(0)>0]
但是,如果你想删除你需要的两个
M = M[M.getnnz(1)>0][:,M.getnnz(0)>0] #GOOD
我不知道为什么但是
M = M[M.getnnz(1)>0, M.getnnz(0)>0] #BAD
不起作用。
没有现有的功能,但编写自己的功能并不算太糟糕:
def remove_zero_rows(M):
M = scipy.sparse.csr_matrix(M)
首先,将矩阵转换为CSR(压缩稀疏行)格式。 这很重要,因为CSR矩阵将其数据存储为三个(data, indices, indptr)
,其中data
保存非零值, indices
存储列索引, indptr
保存行索引信息。 文档解释得更好:
行i的列索引存储在
indices[indptr[i]:indptr[i+1]]
,它们的对应值存储在data[indptr[i]:indptr[i+1]]
。
因此,要查找没有任何非零值的行,我们只需查看M.indptr
连续值M.indptr
。 从上面继续我们的功能:
num_nonzeros = np.diff(M.indptr)
return M[num_nonzeros != 0]
CSR格式的第二个好处是切片行相对便宜,这简化了生成矩阵的创建。
谢谢你的回复@perimosocordiae
我自己找到另一种解决方案。 我发布在这里以防将来有人可能需要它。
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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.