Ne stocker que ce qui n'est pas nul
Beaucoup de grandes matrices sont presque entièrement nulles. Une grille pour valoriser une option a une ligne par niveau de prix, et chaque ligne ne touche que ses deux voisines. Une telle matrice est dite creuse. Stocker chaque zéro gaspille mémoire et temps. scipy.sparse ne garde que les entrées non nulles. Le format csr_matrix (ligne creuse compressée) utilise trois listes. data contient les valeurs non nulles ligne par ligne, indices la colonne de chaque valeur, et indptr dit où chaque ligne commence et finit dans data : la ligne est data[indptr[i]:indptr[i+1]]. Le dernier nombre de indptr est le nombre de valeurs non nulles, nnz.
Des formats différents conviennent à des tâches différentes. coo_matrix stocke de simples triplets (ligne, colonne, valeur) et c'est la façon facile de construire une matrice. csr_matrix est rapide pour les tranches de lignes et pour le produit , qui coûte environ nnz multiplications au lieu de . csc_matrix est la même idée par colonnes, et dia_matrix stocke des diagonales, idéal pour les matrices bandes. Pour un système , sparse.linalg.spsolve exploite les zéros pour être bien plus rapide qu'une résolution dense. Le creux n'est pas toujours meilleur : si plus d'un tiers environ des entrées sont non nulles, la comptabilité coûte plus qu'elle ne rapporte. En finance, la sparsité apparaît dans les grilles de valorisation, dans les modèles à facteurs où la plupart des expositions sont nulles, et quand on ne garde que les fortes corrélations.
data=[5,1,2,3,4], indices=[0,3,2,0,3] et indptr=[0,2,3,3,5]. La ligne est vide car indptr[2]=indptr[3]=3, et nnz=5. Multiplier par additionne chaque ligne, ce qui donne avec seulement multiplications. Une matrice tridiagonale avec , comme une grille de valorisation aux différences finies, a valeurs non nulles sur entrées, soit une densité de . Elle demande environ Ko en CSR contre Mo en dense. Sur données réelles, les corrélations de actions du fichier de prix partagé forment une matrice . Ne garder que les entrées avec laisse des entrées, soit , et la copie CSR prend Ko contre Ko en dense. À , il n'en reste que .- Trois listes :
data,indicesetindptrdécrivent une matrice CSR, etindptr[-1]est le nombre de valeurs non nulles. - Construire en COO, calculer en CSR : les triplets sont faciles à assembler, le stockage par lignes est rapide pour produits et résolutions.
- Le creux ne paie que s'il y a surtout des zéros : une matrice dense vaut mieux quand beaucoup d'entrées sont non nulles.
Lab : ce qui est noté
- Compter les valeurs non nulles10 pts
- Combien de valeurs dans une ligne10 pts
- La densité d'une grille10 pts
- Un produit creux15 pts
- Quel format pour quelle tâche15 pts
- Un système tridiagonal10 pts
- Quand le creux rapporte et quand non30 pts