2014-10-13 20 views
5

Sto usando python scikit-learn per il documento clustering e ho una matrice sparsa memorizzato in un oggetto dict:Conversione pitone sparse dict matrice per SciPy matrici sparse

Ad esempio:

doc_term_dict = { ('d1','t1'): 12,    \ 
        ('d2','t3'): 10,    \ 
        ('d3','t2'): 5    \ 
        }       # from mysql data table 
<type 'dict'> 

voglio utilizzare scikit-learn per eseguire il clustering in cui il tipo di matrice di input è scipy.sparse.csr.csr_matrix

Esempio:

(0, 2164) 0.245793088885 
(0, 2076) 0.205702177467 
(0, 2037) 0.193810934784 
(0, 2005) 0.14547028437 
(0, 1953) 0.153720023365 
... 
<class 'scipy.sparse.csr.csr_matrix'> 

non riesco a trovare un modo per convertire dict a questo CSR-matrice (non ho mai usato scipy.)

+0

grazie @dataman ha modificato la mia domanda – chent

risposta

5

piuttosto semplice. Prima leggi il dizionario e converti le chiavi nella riga e nella colonna appropriate. Scipy supporta (e raccomanda a tale scopo) lo COO-rdinate format per le matrici sparse.

Passo esso data, row e column, dove A[row[k], column[k] = data[k] (per ogni k) definisce la matrice. Quindi lascia che Scipy faccia la conversione in CSR.

Si prega di verificare, che ho righe e colonne nel modo in cui li vuoi, potrei averli trasposti. Ho anche pensato che l'input fosse 1-indexed.

mio codice qui sotto stampe:

(0, 0)  12 
(1, 2)  10 
(2, 1)  5 

Codice:

#!/usr/bin/env python3 
#http://stackoverflow.com/questions/26335059/converting-python-sparse-matrix-dict-to-scipy-sparse-matrix 

from scipy.sparse import csr_matrix, coo_matrix 

def convert(term_dict): 
    ''' Convert a dictionary with elements of form ('d1', 't1'): 12 to a CSR type matrix. 
    The element ('d1', 't1'): 12 becomes entry (0, 0) = 12. 
    * Conversion from 1-indexed to 0-indexed. 
    * d is row 
    * t is column. 
    ''' 
    # Create the appropriate format for the COO format. 
    data = [] 
    row = [] 
    col = [] 
    for k, v in term_dict.items(): 
     r = int(k[0][1:]) 
     c = int(k[1][1:]) 
     data.append(v) 
     row.append(r-1) 
     col.append(c-1) 
    # Create the COO-matrix 
    coo = coo_matrix((data,(row,col))) 
    # Let Scipy convert COO to CSR format and return 
    return csr_matrix(coo) 

if __name__=='__main__': 
    doc_term_dict = { ('d1','t1'): 12,    \ 
       ('d2','t3'): 10,    \ 
       ('d3','t2'): 5    \ 
       } 
    print(convert(doc_term_dict)) 
2

Possiamo fare di @ Unapiedra (eccellente) rispondere a un po 'più radi:

from scipy.sparse import csr_matrix 
def _dict_to_csr(term_dict): 
    term_dict_v = list(term_dict.itervalues()) 
    term_dict_k = list(term_dict.iterkeys()) 
    shape = list(repeat(np.asarray(term_dict_k).max() + 1,2)) 
    csr = csr_matrix((term_dict_v, zip(*term_dict_k)), shape = shape) 
    return csr 
0

Uguale @carsonc , ma per Python 3.X:

from scipy.sparse import csr_matrix 
def _dict_to_csr(term_dict): 
    term_dict_v = term_dict.values() 
    term_dict_k = term_dict.keys() 
    term_dict_k_zip = zip(*term_dict_k) 
    term_dict_k_zip_list = list(term_dict_k_zip) 

    shape = (len(term_dict_k_zip_list[0]), len(term_dict_k_zip_list[1])) 
    csr = csr_matrix((list(term_dict_v), list(map(list, zip(*term_dict_k)))), shape = shape) 
    return csr 
Problemi correlati