2012-03-24 8 views
5

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?

risposta

3

Prova

sm[np.random.sample(sm.shape[0], K, replace=False), :] 

Questo si ottiene su una matrice LIL formato con solo K delle righe (nell'ordine determinato dal random.sample). Non sono sicuro che sia super veloce, ma non può essere peggio dell'accesso manuale riga per riga come si sta facendo attualmente e probabilmente prealloca i risultati.

+0

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

+0

@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

+0

grazie! funziona come un fascino. – ScienceFriction