2015-05-11 27 views
6

Questa è una domanda molto semplice. Per le matrici sparse di SciPy come coo_matrix, come si accede ai singoli elementi?Accesso agli elementi in coo_matrix

Per fornire un'analogia con la libreria di algebra lineare Eigen. Si può accedere elemento (i, j) utilizzando coeffRef come segue:

myMatrix.coeffRef(i,j) 
+0

'mymatrix [i, j]' – Jaime

+0

L'ho provato. Ottengo il seguente errore: TypeError: l'oggetto 'coo_matrix' non ha attributo '__getitem__' – haripkannan

+0

Guarda gli altri formati sparsi – hpaulj

risposta

12

Dalla documentazione per coo_matrix:

| Intended Usage 
|  - COO is a fast format for constructing sparse matrices 
|  - Once a matrix has been constructed, convert to CSR or 
|  CSC format for fast arithmetic and matrix vector operations 
|  - By default when converting to CSR or CSC format, duplicate (i,j) 
|  entries will be summed together. This facilitates efficient 
|  construction of finite element matrices and the like. (see example) 

E, in effetti, csr_matrix supporta l'indicizzazione in modo atteso:

>>> from scipy.sparse import coo_matrix 
>>> m = coo_matrix([[1, 2, 3], [4, 5, 6]]) 
>>> m1 = m.tocsr() 
>>> m1[1, 2] 
6 
>>> m1 
<2x3 sparse matrix of type '<type 'numpy.int64'>' 
    with 6 stored elements in Compressed Sparse Row format> 

(Il modo in cui ho trovato la citazione sopra dai documenti era >>> help(m) che equivale a the online docs).

+0

Grazie. Questo funzionerà. – haripkannan

+0

'todok' potrebbe essere più veloce. – hpaulj

5

Per espandere sulla conversione di una matrice coo per csr all'indice, ecco alcuni tempi per una piccola matrice sparsa

Effettuare la matrice

In [158]: M=sparse.coo_matrix([[0,1,2,0,0],[0,0,0,1,0],[0,1,0,0,0]]) 

In [159]: timeit M[1,2] 
TypeError: 'coo_matrix' object is not subscriptable 

In [160]: timeit M.tocsc()[1,2] 
1000 loops, best of 3: 375 µs per loop 

In [161]: timeit M.tocsr()[1,2] 
1000 loops, best of 3: 241 µs per loop 

In [162]: timeit M.todok()[1,2] 
10000 loops, best of 3: 65.8 µs per loop 

In [163]: timeit M.tolil()[1,2] 
1000 loops, best of 3: 270 µs per loop 

Apparentemente per la selezione di un singolo elemento, dok, è fastests (contando il tempo di conversione). Questo formato è in realtà un dizionario, che ovviamente ha un accesso veloce agli elementi.

Tuttavia, se si accede frequentemente a intere righe o intere colonne o iterando su righe o colonne, è necessario leggere i documenti con maggiore attenzione e potrebbe essere necessario eseguire i propri test di tempo sugli array tipici.

Se si impostano valori, non solo li leggono, i tempi e persino l'implementazione possono essere diversi. Si riceverà un avviso di efficienza se si tenta di modificare un elemento 0 di un formato csr o csc.

+0

Grazie mille. Informazioni molto utili. – haripkannan

Problemi correlati