web-dev-qa-db-fra.com

Comment transformer numpy.matrix ou un tableau en matrice scipy sparse

Pour la matrice fragmentée SciPy, vous pouvez utiliser todense() ou toarray() pour la transformation en matrice ou en tableau NumPy. Quelles sont les fonctions pour faire l'inverse?

J'ai cherché, mais je ne savais pas quels mots clés devraient être le bon résultat.

62
Flake

Vous pouvez passer un tableau ou une matrice numpy en tant qu'argument lors de l'initialisation d'une matrice fragmentée. Pour une matrice CSR, par exemple, vous pouvez procéder comme suit.

>>> import numpy as np
>>> from scipy import sparse
>>> A = np.array([[1,2,0],[0,0,3],[1,0,4]])
>>> B = np.matrix([[1,2,0],[0,0,3],[1,0,4]])

>>> A
array([[1, 2, 0],
       [0, 0, 3],
       [1, 0, 4]])

>>> sA = sparse.csr_matrix(A)   # Here's the initialization of the sparse matrix.
>>> sB = sparse.csr_matrix(B)

>>> sA
<3x3 sparse matrix of type '<type 'numpy.int32'>'
        with 5 stored elements in Compressed Sparse Row format>

>>> print sA
  (0, 0)        1
  (0, 1)        2
  (1, 2)        3
  (2, 0)        1
  (2, 2)        4
101
David Alber

Il existe plusieurs classes matricielles rares dans scipy.

bsr_matrix (arg1 [ forme, type, copie, taille de bloc]) Matrice Block Sparse Row
coo_matrix (arg1 [ shape, dtype, copy]) Une matrice clairsemée au format COOrdinate.
csc_matrix (arg1 [ shape, dtype, copy]) Matrice de colonnes fragmentées compressées
csr_matrix (arg1 [ forme, type, copie]) Matrice de lignes fragmentées compressées
dia_matrix (arg1 [ forme, type, copie]) Matrice creuse avec stockage DIAgonal
dok_matrix (arg1 [ shape, dtype, copy]) Dictionnaire de clés basé sur une matrice fragmentée.
lil_matrix (arg1 [ shape, dtype, copy]) Matrice creuse de liste chaînée basée sur les lignes

Chacun d'entre eux peut faire la conversion.

import numpy as np
from scipy import sparse
a=np.array([[1,0,1],[0,0,1]])
b=sparse.csr_matrix(a)
print(b)

(0, 0)  1
(0, 2)  1
(1, 2)  1

Voir http://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information .

20
cyborg

En ce qui concerne l'inverse, la fonction est inv(A), mais je ne recommanderai pas de l'utiliser car, pour les énormes matrices, il est très coûteux en calcul et instable. Utilisez plutôt une approximation de l'inverse, ou si vous voulez résoudre Ax = b, vous n'avez pas vraiment besoin de A-1.