2011-08-04 24 views
6

Estoy tratando de poner en práctica la siguiente ecuación usando el paquete de escasa scipy:suma la realización de los productos exteriores de matrices dispersas

W = x[:,1] * y[:,1].T + x[:,2] * y[:,2].T + ... 

donde x & y son una csc_matrix nxm. Básicamente estoy tratando de multiplicar cada col de x por cada col de y y sumar las matrices nxn resultantes. entonces yo quiero que todos los elementos no nulos 1.

Ésta es mi implementación actual:

c = sparse.csc_matrix((n, n)) 
    for i in xrange(0,m): 
     tmp = bam.id2sym_thal[:,i] * bam.id2sym_cort[:,i].T 
     minimum(tmp.data,ones_like(tmp.data),tmp.data) 
     maximum(tmp.data,ones_like(tmp.data),tmp.data) 

     c = c + tmp 

Esta aplicación tiene los siguientes problemas:

  1. uso de memoria parece explotar. Según tengo entendido, la memoria solo debería aumentar a medida que c se vuelve menos dispersa, pero estoy viendo que el ciclo comienza a consumir> 20GB de memoria con un = 10,000, m = 100,000 (cada fila de x & y solo tiene alrededor de 60 cero elementos).

  2. Estoy usando un bucle de python que no es muy eficiente.

Mi pregunta: ¿Hay una mejor manera de hacerlo? Controlar el uso de la memoria es mi principal preocupación, ¡pero sería genial hacerlo más rápido!

¡Gracias!

+0

'x [:, i]' se van a darle la columna de orden i del 'x', no la fila – JoshAdel

+0

@JoshAdel: Tienes razón, me equivoqué, que quería decir multiplicar las columnas de X por columnas de y He actualizado la pregunta. ¡Gracias! – RussellM

+0

Su ecuación es una suma de productos internos, no productos externos. Debe transponer las columnas de 'y', no' x'. (O eso, o el título es incorrecto.) –

Respuesta

3

Tenga en cuenta que una suma de productos exteriores de la manera que usted describe es simplemente lo mismo que multiplicar dos matrices . En otras palabras,

sum_i X[:,i]*Y[:,i].T == X*Y.T 

Así que simplemente multiplique las matrices juntas.

Z = X*Y.T 

Para n = 10.000 y M = 100,000 y donde cada columna tiene un elemento distinto de cero en ambos X e Y, se calcula casi instantáneamente en mi portátil.

+1

Y el último paso sería establecer elementos distintos de cero en 1, como Z.data [:] = 1. Al difícil no es muy claro, si esto es lo que OP estaba buscando. Gracias – eat

+0

Esta es la solución que fui. ¿Es esto cierto para todas las matrices o depende de cuán escasos son mis vectores? Utilicé el consejo de eat y también configuré todos los elementos distintos de cero en uno. ¡Gracias! – RussellM

+0

Deje 'X = [x1 x2 ... xk]' donde 'xi' es la i^ésima columna en la matriz n-by-k X.Deje 'Y = [y1 y2 ... yk]' donde 'yi' es la i^ésima columna en la matriz m-by-k Y. Luego para * any *' X' y 'Y',' Z = X * YT = sum_i xi * yi.T', donde 'Z' es n-by-m. –

Cuestiones relacionadas