2012-05-19 32 views
10

從只包含零的稀疏矩陣中有效地移除列的最佳方式是什麼?我有一個矩陣,我已經創建並填充了數據:如何從只包含零的稀疏矩陣中有效地移除列?

matrix = sp.sparse.lil_matrix((100, 100)) 

我現在希望刪除〜最後20列只包含零數據。我怎樣才能做到這一點?

+3

你承諾用lil_matrix?根據scipy文檔,對列分割效率不高 - 您可以考慮使用csc_matrix。參見:http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix.html和http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse。 csc_matrix.html –

+0

感謝您的幫助。是的,csr或csc也很好。 – turtle

+0

@turtle是否回答了您的問題? – gabe

回答

8

如果這只是一個numpy的陣列,X,那麼你可以說X!=0這將使你同樣形狀的布爾數組作爲X ,然後你可以索引X與布爾數組,即non_zero_entries = X[X!=0]

但是,這是它不支持布爾索引和也不會給你想要的東西,如果你嘗試X!=0稀疏矩陣 - 它只是返回一個唱le布爾值似乎只返回真如果他們是完全相同的矩陣(在內存中)。

你想要的是從numpy的nonzero方法。

import numpy as np 
from scipy import sparse 

X = sparse.lil_matrix((100,100)) # some sparse matrix 
X[1,17] = 1 
X[17,17] = 1 
indices = np.nonzero(X) # a tuple of two arrays: 0th is row indices, 1st is cols 
X.tocsc()[indices] # this just gives you the array of all non-zero entries 

如果你只想要全列有非零的條目,那麼只要從索引中獲得第一個。除非你需要考慮重複的指標(如果有一列中一個以上的條目):

columns_non_unique = indices[1] 
unique_columns = sorted(set(columns_non_unique)) 
X.tocsc()[:,unique_columns] 
+3

我用下面的方法只提取非零條目的列:'matrix [:,np.unique(alldata.nonzero()[1])]' – canzar

+0

這很好,很緊湊。幾乎相同,除了你使用numpy的獨特而不是'sorted(set(columns))'。 – gabe

+1

爲了清楚起見,大多數稀疏矩陣都有一個'.nonzero'方法,其工作方式相同,比'np.nonzero(sparse_matrix)'快得多。儘管如此,仍然有幫助。 –

1

這看起來像的方式,雖然不是非常高效:

matrix = matrix[0:100,0:80] 
+0

不幸的是,零列的數量並不總是固定的。我需要一種方法來做到這一點,如果有35個零列或10個零列,程序仍然可以工作。 – turtle

0

你也可以使用 scipy.sparse.find() 得到稀疏矩陣中所有非零元素的位置。

返回值中的[1] th條目是列號的一個numpy數組。從該數組中取出唯一值給出非零列的索引。通過這些列對原始稀疏矩陣進行子集賦予我們非零列。

x[:,np.unique(sparse.find(x)[1])] 

一個可以擴展到找到至少n條目列:

idx = np.unique(sparse.find(x)[1], return_counts=True) 
x[:, idx[0][idx[1] > n]]