2024-04-24 08:55:19 发布
网友
我有一个稀疏矩阵,它是从sklearn tfidfVectorier转换而来的。我相信有些行都是零行。我想把它们移走。然而,据我所知,现有的内置函数,例如nonzero()和eximinate_zero(),关注的是零个条目,而不是行。
有什么简单的方法可以从稀疏矩阵中删除所有的零行吗?
示例: 我现在拥有的(实际上是稀疏格式的):
[ [0, 0, 0] [1, 0, 2] [0, 0, 1] ]
我想得到的是:
[ [1, 0, 2] [0, 0, 1] ]
谢谢你的回复,@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]
切片可以做到:
M = M[M.getnnz(1)>0]
直接作用于csr_array。 也可以在不更改格式的情况下删除所有0列:
csr_array
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 (compressed sparse row)格式。这一点很重要,因为CSR矩阵将其数据存储为(data, indices, indptr)的三元组,其中data保存非零值,indices存储列索引,而indptr保存行索引信息。这些文件解释得更好:
(data, indices, indptr)
data
indices
indptr
the column indices for row i are stored in indices[indptr[i]:indptr[i+1]] and their corresponding values are stored in data[indptr[i]:indptr[i+1]].
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
我只是自己找到另一个解决办法。我在这里发帖,以防将来有人需要。
切片可以做到:
直接作用于
csr_array
。 也可以在不更改格式的情况下删除所有0列:但是,如果要同时删除它们,则需要
我不知道为什么但是
不起作用。
目前还没有这方面的函数,但编写自己的函数也不算太糟:
首先,将矩阵转换为CSR (compressed sparse row)格式。这一点很重要,因为CSR矩阵将其数据存储为
(data, indices, indptr)
的三元组,其中data
保存非零值,indices
存储列索引,而indptr
保存行索引信息。这些文件解释得更好:因此,要查找没有任何非零值的行,我们可以只查看
M.indptr
的连续值。从上面继续我们的职能:CSR格式的第二个好处是对行进行切片相对便宜,这简化了生成的矩阵的创建。
相关问题 更多 >
编程相关推荐