Si esto fuera sólo una matriz numpy, X
, entonces se podría decir X!=0
lo que le daría una matriz booleana de la misma forma que X
y entonces se podría índice X
con la matriz booleana, es decir non_zero_entries = X[X!=0]
Pero esto es una matriz dispersa que no soporta la indexación booleano y también no le dará lo que quiere si intenta X!=0
- sólo se devuelve un canto le valor booleano que parece devolver verdadero solo si son exactamente la misma matriz (en memoria).
Lo que quiere es el método nonzero
de 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
Si solo desea las columnas completas donde hay entradas distintas de cero, simplemente tome la 1ra de los índices. Salvo que usted necesita para tener en cuenta los índices repetidos (si hay más de uno entradas de una columna):
columns_non_unique = indices[1]
unique_columns = sorted(set(columns_non_unique))
X.tocsc()[:,unique_columns]
¿Estás comprometido a utilizar lil_matrix? De acuerdo con los documentos scipy, no es eficiente para el corte de columnas; en su lugar, podría considerar csc_matrix. Ver: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix.html y http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse. csc_matrix.html –
Gracias por la ayuda. Sí, csr o csc también está bien. – turtle
@turtle ¿Respondió esto a tu pregunta? – gabe