2011-06-06 17 views
8

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 que no sea cero?scipy.sparse valor predeterminado

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

Respuesta

8

Esa característica no está incorporado, pero si realmente necesita esto, usted debe estar capaz de 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 haya otros cambios que deban realizarse.

Sin embargo, trataría de reformular el problema para que esto no sea necesario. Si, por ejemplo, hace álgebra lineal, se puede aislar el término constante, y hacer 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 vez de opA.

En cuanto al logaritmo de la matriz: el logaritmo de una matriz dispersa (como en scipy.linalg.logm) es típicamente denso, por lo que conviene convertir primero la matriz en una densa y luego calcular el logaritmo como siempre. Por lo que veo, usar una matriz dispersa no daría ganancia de rendimiento. Si solo necesita calcular un producto de un vector y el logaritmo, vector log(A) * v, algún método de Krylov podría ayudar, sin embargo.

Si otoh desea calcular la elementwise logaritmo, puede modificar el atributo .data directamente (disponible al menos en COO, RSE, y CSC)

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

Esto deja a los elementos cero solo, sino que el anterior , esto permite tratar la parte constante por separado.

+1

Gracias! Es desafortunado que estas funciones simples no se hayan implementado directamente aún :( – ElKamina

+0

Diría que esto sería una funcionalidad bastante especial en lugar de simple para matrices dispersas :) No sé si tales cosas se implementan en otras áreas dispersas paquetes de matriz, pero AFAIK Matlab no parece tener tales cosas. El problema es que muchas operaciones que puede hacer con matrices dispersas (por ejemplo, factorización, etc.) no funcionarían bien si el valor "faltante" fuera distinto de cero. –

+0

@pv Sí. Estoy de acuerdo con usted en el problema de valor predeterminado. Pero otras cosas como calcular el registro de la matriz deberían haberse implementado. Un poco de trivia. Para ciertos tipos de matrices dispersas X + 1 funciona, pero 1 + X plantea excepciones no implementadas: D – ElKamina