2015-05-11 6 views
6

To bardzo proste pytanie. W przypadku rzadkich macierzy SciPy, takich jak coo_matrix, w jaki sposób uzyskać dostęp do poszczególnych elementów?Dostęp do elementów w coo_matrix

Podać analogię do biblioteki algebry liniowej Eigen. Można uzyskać dostęp do elementu (i, j) przy użyciu coeffRef następująco:

myMatrix.coeffRef(i,j) 
+0

'mymatrix [i, j]' – Jaime

+0

Próbowałem tego. Pojawia się następujący błąd: TypeError: obiekt "coo_matrix" nie ma atrybutu "__getitem__" – haripkannan

+0

Zobacz inne rzadkie formaty – hpaulj

Odpowiedz

12

Od docs dla 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) 

i rzeczywiście, csr_matrix wspiera indeksowanie w oczekiwanym sposób:

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

(Sposób, w jaki znalazłem powyższy cytat z dokumentacji to >>> help(m), który jest równoważny z the online docs).

+0

Dzięki. To zadziała. – haripkannan

+0

'todok' może być szybszy. – hpaulj

5

Aby rozwinąć na przekształcenie coo macierz csr do indeksu, oto kilka czasy dla małego rozrzedzony matrycy

Bądź matrycę

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 

Widocznie wyboru pojedynczego elementu, dok jest fastests (licząc czas konwersji). Ten format jest właściwie słownikiem, który oczywiście ma szybki dostęp do elementu.

Ale jeśli często uzyskujesz dostęp do całych wierszy lub całych kolumn lub powtarzania wierszy lub kolumn, musisz uważniej czytać dokumenty i wykonywać własne testy typowych tablic.

Jeśli ustawiasz wartości, a nie tylko je czytasz, czasy, a nawet implementacja mogą być różne. Otrzymasz ostrzeżenie o wydajności, jeśli spróbujesz zmienić element 0 w formacie lub csc.

+0

Wielkie dzięki. Bardzo przydatne informacje. – haripkannan