Me gustaría escribir una función que normalice las filas de una matriz dispersa grande (de modo que sumen a una).Manera eficiente de normalizar una matriz dispersa de Scipy
from pylab import *
import scipy.sparse as sp
def normalize(W):
z = W.sum(0)
z[z < 1e-6] = 1e-6
return W/z[None,:]
w = (rand(10,10)<0.1)*rand(10,10)
w = sp.csr_matrix(w)
w = normalize(w)
Sin embargo, esto da la siguiente excepción:
File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 325, in __div__
return self.__truediv__(other)
File "/usr/lib/python2.6/dist-packages/scipy/sparse/compressed.py", line 230, in __truediv__
raise NotImplementedError
¿Hay soluciones razonablemente simples? Miré this, pero aún no estoy seguro de cómo hacer la división.
Esto es básicamente un duplicado de: http: //stackoverflow.c om/questions/12237954/multiplying-elements-in-a-sparse-array-with-rows-in-matrix ya que no importa si se trata de una división o multiplicación de elementos por fila. Por supuesto, si alguien tiene una mejor respuesta, genial :) – seberg
Genial, ¡gracias! – sterne
No estoy de acuerdo, este es un problema diferente. El duplicado que apuntó hace multiplicación de elemento, mientras que esta pregunta parece querer dividir cada fila por un valor diferente (en lugar de todos los elementos distintos de cero por el mismo valor). La siguiente solución de Aaron McDaid debería funcionar de manera eficiente (y no requiere ninguna copia de datos). – conradlee