Se questo fosse solo un allineamento NumPy, X
, allora si potrebbe dire X!=0
che darebbe un allineamento booleano della stessa forma X
, e quindi si potrebbe indice X
con l'array booleano, vale a dire non_zero_entries = X[X!=0]
Ma questa è una matrice sparsa che non supporta l'indicizzazione booleano e, inoltre, non vi darà ciò che vuoi se si tenta X!=0
- si restituisce solo un cantare il valore booleano che sembra restituire true solo se sono esattamente la stessa matrice (in memoria).
Quello che vuoi è il metodo nonzero
da 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
Se si desidera solo le colonne complete dove ci sono voci diverse da zero, basta prendere il primo dagli indici. Tranne che è necessario tenere conto di indici ripetuti (se ci sono più di uno voci in una colonna):
columns_non_unique = indices[1]
unique_columns = sorted(set(columns_non_unique))
X.tocsc()[:,unique_columns]
Siete impegnati ad usare lil_matrix? Secondo i documenti scipy, non è efficiente per l'affettamento di colonne - si potrebbe invece prendere in considerazione csc_matrix. Vedi: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix.html e http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse. csc_matrix.html –
Grazie per l'aiuto. Sì, csr o csc va bene anche. – turtle
@turtle ha risposto alla tua domanda? – gabe