Если бы это было просто NumPy массив, X
, то можно сказать, X!=0
который даст вам булево массив той же формы, как X
, а затем вы можете индекс X
с булевой массива, т.е. non_zero_entries = X[X!=0]
Но это разреженная матрица, которая не поддерживает логическое индексирование, а также не даст вам то, что вы хотите, если вы пытаетесь X!=0
- он просто возвращает петь le boolean значение, которое, кажется, возвращает true только в том случае, если они являются одинаковой матрицей (в памяти).
Что вы хотите, это метод nonzero
от numpy.
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
Если вы хотите только полные столбцы, где есть ненулевые записи, то просто возьмите 1-й из индексов. Кроме того вы должны учитывать повторяющиеся индексы (если есть несколько записей в столбце):
columns_non_unique = indices[1]
unique_columns = sorted(set(columns_non_unique))
X.tocsc()[:,unique_columns]
Вы обязались использовать lil_matrix? Согласно scipy docs, это не эффективно для разбиения столбцов - вместо этого вы можете использовать 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