2011-12-02 21 views
5

Necesito una manera eficiente de remar estandarizar una matriz dispersa.Fila eficientemente Estandarizar una matriz

Dado

W = matrix([[0, 1, 0, 1, 0, 0, 0, 0, 0], 
      [1, 0, 1, 0, 1, 0, 0, 0, 0], 
      [0, 1, 0, 0, 0, 1, 0, 0, 0], 
      [1, 0, 0, 0, 1, 0, 1, 0, 0], 
      [0, 1, 0, 1, 0, 1, 0, 1, 0], 
      [0, 0, 1, 0, 1, 0, 0, 0, 1], 
      [0, 0, 0, 1, 0, 0, 0, 1, 0], 
      [0, 0, 0, 0, 1, 0, 1, 0, 1], 
      [0, 0, 0, 0, 0, 1, 0, 1, 0]]) 
row_sums = W.sum(1) 

que necesito para producir ...

W2 = matrix([[0. , 0.5 , 0. , 0.5 , 0. , 0. , 0. , 0. , 0. ], 
      [0.33, 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0. ], 
      [0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. , 0. , 0. ], 
      [0.33, 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0. ], 
      [0. , 0.25, 0. , 0.25, 0. , 0.25, 0. , 0.25, 0. ], 
      [0. , 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0.33], 
      [0. , 0. , 0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. ], 
      [0. , 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0.33], 
      [0. , 0. , 0. , 0. , 0. , 0.5 , 0. , 0.5 , 0. ]]) 

Cuando,

for i in range(9): 
    W2[i] = W[i]/row_sums[i] 

Me gustaría encontrar una manera de hacer esto sin bucles (es decir, Vectorizado) y usando matrices Scipy.sparse. W podría ser tan grande a 10mil x 10mil.

+1

Me acabo de dar cuenta si W es densa (una matriz numpy regular). W2 = W/W.sum (1) funciona bien. Pero las dispersas matrices de scipy no parecen apoyar la división. – Charles

+0

No veo una forma de hacerlo que no sea implementar esta división en código C y llamar desde Python. ¿El W.sum para matriz dispersa funciona bien? – jsbueno

+0

Sí, W.sum (1) en el disperso devuelve un vector de sumas de fila. – Charles

Respuesta

6

con un poco de álgebra matricial

>>> cc 
<9x9 sparse matrix of type '<type 'numpy.int32'>' 
    with 24 stored elements in Compressed Sparse Row format> 
>>> ccd = sparse.spdiags(1./cc.sum(1).T, 0, *cc.shape) 
>>> ccn = ccd * cc 
>>> np.round(ccn.todense(), 2) 
array([[ 0. , 0.5 , 0. , 0.5 , 0. , 0. , 0. , 0. , 0. ], 
     [ 0.33, 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0. ], 
     [ 0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. , 0. , 0. ], 
     [ 0.33, 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0. ], 
     [ 0. , 0.25, 0. , 0.25, 0. , 0.25, 0. , 0.25, 0. ], 
     [ 0. , 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0.33], 
     [ 0. , 0. , 0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. ], 
     [ 0. , 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0.33], 
     [ 0. , 0. , 0. , 0. , 0. , 0.5 , 0. , 0.5 , 0. ]]) 
>>> ccn 
<9x9 sparse matrix of type '<type 'numpy.float64'>' 
    with 24 stored elements in Compressed Sparse Row format> 
+0

¡Eso es lo que estoy buscando, gracias! – Charles

Cuestiones relacionadas