2014-10-13 31 views
5

ich Python bin mit scikit-learn für Dokumenten-Clustering und ich habe eine Sparse Matrix in einem dict Objekt gespeichert:Python Sparse Matrix dict Konvertieren Sparse Matrix SciPy

Zum Beispiel:

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

Ich mag zu verwenden scikit-learn, um das Clustering zu tun, wo der Eingabe-Matrix-Typ ist scipy.sparse.csr.csr_matrix

Beispiel:

(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'> 

Ich kann nicht einen Weg finden, dict diese csr-Matrix zu konvertieren (ich nie scipy verwendet habe.)

+0

danke @dataman meine Frage bearbeitet – chent

Antwort

5

ziemlich einfach. Lesen Sie zuerst das Wörterbuch und konvertieren Sie die Schlüssel in die entsprechende Zeile und Spalte. Scipy unterstützt (und empfiehlt zu diesem Zweck) die COO-rdinate format für dünn besetzte Matrizen.

Pass es data, row und column, wo A[row[k], column[k] = data[k] (für alle k) die Matrix definiert. Dann lass Scipy die Konvertierung zu CSR machen.

Bitte überprüfen Sie, dass ich Zeilen und Spalten in der Art und Weise habe, wie Sie sie wollen, ich könnte sie transponiert haben. Ich nahm auch an, dass die Eingabe 1-indexiert sein würde.

Mein Code unten druckt:

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

Code:

#!/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

Wir @ Unapiedra der (sehr zufrieden) beantworten etwas spärlicher machen:

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

Gleiche wie @carsonc , aber für 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 
Verwandte Themen