簡體   English   中英

scipy稀疏矩陣:刪除所有元素為零的行

[英]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_arraycsr_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM