2010-06-24 30 views
6

Estoy usando Scipy para construir una matriz de co-ocurrencia grande, dispersa (250k X 250k) usando scipy.sparse.lil_matrix. Las matrices de coincidencia son triangulares; es decir, M [i, j] == M [j, i]. Dado que sería altamente ineficiente (y en mi caso, imposible) almacenar todos los datos dos veces, actualmente estoy almacenando datos en la coordenada (i, j) donde siempre es menor que j. Entonces, en otras palabras, tengo un valor almacenado en (2,3) y ningún valor almacenado en (3,2), aunque (3,2) en mi modelo debería ser igual a (2,3). (Consulte la siguiente matriz para ver un ejemplo)matriz triangular dispersa Scipy?

Mi problema es que tengo que poder extraer aleatoriamente los datos correspondientes a un índice determinado, pero, al menos de la forma en que lo estoy haciendo ahora, la mitad de los datos está en la fila y la mitad se encuentra en la columna, así:

M = 
    [1 2 3 4 
    0 5 6 7 
    0 0 8 9 
    0 0 0 10] 

por lo tanto, dada la matriz anterior, quiero ser capaz de hacer una consulta como M[1], y volver [2,5,6,7]. Tengo dos preguntas:

1) ¿Hay una forma más eficiente (preferiblemente integrada) para hacer esto que primero consultar la fila, y luego la columna, y luego concatenar los dos? Esto es malo porque si utilizo una representación interna CSC (basada en columna) o CSR (basada en fila), una de las dos consultas es muy ineficiente.

2) ¿Estoy usando la parte correcta de Scipy? He visto algunas funciones en la biblioteca de Scipy que mencionan matrices triangulares, pero parecen girar en torno a obtener matrices triangulares de una matriz completa. En mi caso, (creo) ya tengo una matriz triangular y quiero manipularla.

Muchas gracias.

+1

se llama conjunto de almacenamiento triangular superior. No creo que haya formas eficientes de obtener una columna o fila completa a partir de una matriz triangular. – Anycorn

+2

'M [i, j] == M [j, i]' significa que la matriz es simétrica, no triangular. – EOL

+0

@EOL Buen punto. Aunque según la definición de Wikipedia, esta matriz también es triangular (superior). – gilesc

Respuesta

1

Yo diría que no puedes comer la torta y comerla también: si quieres un almacenamiento eficiente, no puedes almacenar filas completas (como dices); si desea un acceso eficiente a filas, diría que debe almacenar filas completas.

Mientras actuaciones reales dependen de su aplicación, se puede comprobar si el siguiente enfoque funciona para usted:

  1. Se utiliza Scipy's sparse matrices para el almacenamiento eficiente.

  2. Automáticamente simétricamente su matriz (hay un small recipe en StackOverflow, que funciona al menos en matrices normales).

  3. A continuación, puede acceder a sus filas (o columnas); si esto es eficiente depende de la implementación de matrices dispersas ...

+0

Tenía miedo de eso. Gracias, sin embargo. – gilesc

Cuestiones relacionadas