valor predeterminado scipy.sparse

El formato de matriz dispersa (dok) asume que los valores de las claves que no están en el diccionario son iguales a cero. ¿Hay alguna manera de hacer que use un valor predeterminado distinto de cero?

Además, ¿hay una manera de calcular el registro de una matriz dispersa (similar a np.log en una matriz numpy regular)?

Esa característica no está incorporada, pero si realmente necesitas esto, deberías poder escribir tu propia clase dok_matrix , o la subclase de Scipy. La implementación de Scipy está aquí: https://github.com/scipy/scipy/blob/master/scipy/sparse/dok.py Al menos en los lugares donde se realizan las llamadas dict.* , El valor predeterminado debe cambiarse: – y tal vez hay algunos otros cambios que deben hacerse.

Sin embargo, trataría de reformular el problema para que esto no sea necesario. Si, por ejemplo, haces álgebra lineal, puedes aislar el término constante, y hacerlo en su lugar

 from scipy.sparse.linalg import LinearOperator A = whatever_dok_matrix_minus_constant_term def my_matvec(x): return A*x + constant_term * x.sum() op = LinearOperator(A.shape, matvec=my_matvec) 

Para la mayoría de las rutinas de álgebra lineal (por ejemplo, solucionadores iterativos), puede pasar en op en lugar de A

En cuanto al logaritmo de la matriz: el logaritmo de una matriz dispersa (como en scipy.linalg.logm ) suele ser denso, por lo que debe convertir primero la matriz en una densa, y luego calcular el logaritmo como de costumbre. Por lo que veo, el uso de una matriz dispersa no daría ganancia de rendimiento. Sin embargo, si solo necesita calcular un producto de un vector y el logaritmo, log(A) * v vector, algún método de Krylov podría ayudar.

Si desea calcular el logaritmo de forma elemental, puede modificar el atributo .data directamente (disponible al menos en COO, CSR y CSC)

 x = A.tocoo() x.data = np.log(x.data) A = x.todok() 

Esto deja a los elementos cero solo, pero como anteriormente, permite tratar la parte constante por separado.