Guardar solo lo que no es cero
Muchas matrices grandes son casi todo ceros. Una malla para valorar una opción tiene una fila por nivel de precio, y cada fila toca solo a sus dos vecinas. Una matriz así se llama dispersa. Guardar cada cero desperdicia memoria y tiempo. scipy.sparse guarda solo las entradas distintas de cero. El formato csr_matrix (fila dispersa comprimida) usa tres listas. data contiene los valores no nulos fila por fila, indices la columna de cada valor, e indptr dice dónde empieza y termina cada fila dentro de data: la fila es data[indptr[i]:indptr[i+1]]. El último número de indptr es la cantidad de no nulos, nnz.
Distintos formatos sirven para distintas tareas. coo_matrix guarda simples tripletas (fila, columna, valor) y es la forma fácil de construir una matriz. csr_matrix es rápido para cortes de filas y para el producto , que cuesta unas nnz multiplicaciones en lugar de . csc_matrix es la misma idea por columnas, y dia_matrix guarda diagonales, ideal para matrices de banda. Para un sistema , sparse.linalg.spsolve aprovecha los ceros para ser mucho más rápido que una resolución densa. Lo disperso no siempre es mejor: si más de un tercio de las entradas son no nulas, la contabilidad cuesta más de lo que ahorra. En finanzas, la dispersión aparece en mallas de valoración, en modelos de factores donde la mayoría de las exposiciones son cero y cuando solo se conservan las correlaciones fuertes.
data=[5,1,2,3,4], indices=[0,3,2,0,3] e indptr=[0,2,3,3,5]. La fila está vacía porque indptr[2]=indptr[3]=3, y nnz=5. Multiplicar por suma cada fila y da con solo multiplicaciones. Una matriz tridiagonal con , como una malla de valoración en diferencias finitas, tiene no nulos de entradas, una densidad del . Necesita unos KB en CSR frente a MB densa. Con datos reales, las correlaciones de acciones del archivo de precios compartido forman una matriz . Conservar solo las entradas con deja de , el , y la copia CSR ocupa KB frente a KB densa. Con queda solo el .- Tres listas:
data,indiceseindptrdescriben una matriz CSR, eindptr[-1]es el número de no nulos. - Construir en COO, calcular en CSR: las tripletas son fáciles de ensamblar, el almacenamiento por filas es rápido para productos y resoluciones.
- Lo disperso solo compensa si hay sobre todo ceros: una matriz densa es mejor cuando muchas entradas son no nulas.
Lab: qué se califica
- Contar los no nulos10 pts
- Cuántos valores hay en una fila10 pts
- La densidad de una malla10 pts
- Un producto disperso15 pts
- Qué formato para qué tarea15 pts
- Un sistema tridiagonal10 pts
- Cuándo compensa lo disperso y cuándo no30 pts