Questa domanda ha due parti (forse un soluzione?):facile campionamento di vettori da una matrice sparsa, e la creazione di una nuova matrice dal campione (Python)
vettori campione da una matrice sparsa un modo semplice per campionare i vettori da una matrice sparsa? Quando provo a campionare le righe usando random.sample, ottengo un errore TypeE: la lunghezza della matrice sparsa è ambigua.
from random import sample
import numpy as np
from scipy.sparse import lil_matrix
K = 2
m = [[1,2],[0,4],[5,0],[0,8]]
sample(m,K) #works OK
mm = np.array(m)
sample(m,K) #works OK
sm = lil_matrix(m)
sample(sm,K) #throws exception TypeError: sparse matrix length is ambiguous.
La mia soluzione attuale è quella di campionare dal numero di righe nella matrice, quindi utilizzare getRow() ,, qualcosa come:
indxSampls = sample(range(sm.shape[0]), k)
sampledRows = []
for i in indxSampls:
sampledRows+=[sm.getrow(i)]
Tutte le altre idee efficienti/eleganti? la dimensione della matrice densa è 1000x30000 e potrebbe essere più grande.
Costruzione di una matrice sparsa da un elenco di vettori sparsi: Ora immaginate ho l'elenco dei vettori sampledRows campionati, come posso convertirlo in una matrice sparsa, senza densificare esso, convertirlo in lista di liste e poi Convet a lil_matrix?
non funziona in quanto restituisce un elenco di elenchi in vari vettori di lunghezza e non sparsi (/ non sparsi). per esempio. sm.data [sample (xrange (sm.shape [0]), 2)] restituisce array ([[1, 2], [8]], dtype = oggetto) – ScienceFriction
@ScienceFriction Whoops, hai ragione: io ero test su un campione in cui tutte le righe avevano voci. Ho cambiato la risposta a qualcosa di simile che in realtà ti fa uscire da una matrice sparsa in un solo passaggio. – Dougal
grazie! funziona come un fascino. – ScienceFriction