從只包含零的稀疏矩陣中有效地移除列的最佳方式是什麼?我有一個矩陣,我已經創建並填充了數據:如何從只包含零的稀疏矩陣中有效地移除列?
matrix = sp.sparse.lil_matrix((100, 100))
我現在希望刪除〜最後20列只包含零數據。我怎樣才能做到這一點?
從只包含零的稀疏矩陣中有效地移除列的最佳方式是什麼?我有一個矩陣,我已經創建並填充了數據:如何從只包含零的稀疏矩陣中有效地移除列?
matrix = sp.sparse.lil_matrix((100, 100))
我現在希望刪除〜最後20列只包含零數據。我怎樣才能做到這一點?
如果這只是一個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]
這看起來像的方式,雖然不是非常高效:
matrix = matrix[0:100,0:80]
不幸的是,零列的數量並不總是固定的。我需要一種方法來做到這一點,如果有35個零列或10個零列,程序仍然可以工作。 – turtle
你也可以使用 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]]
你承諾用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 –
感謝您的幫助。是的,csr或csc也很好。 – turtle
@turtle是否回答了您的問題? – gabe