¿Cómo operar elementwise en una matriz de tipo scipy.sparse.csr_matrix?

En numpy, si desea calcular el seno de cada entrada de una matriz (elementise) entonces

a = numpy.arange(0,27,3).reshape(3,3) numpy.sin(a) 

va a hacer el trabajo! Si quieres el poder digamos a 2 de cada entrada.

 a**2 

lo haré.

Pero si tienes una matriz dispersa las cosas parecen más difíciles. Al menos no he encontrado una manera de hacerlo además de iterar sobre cada entrada de un formato lil_matrix y operar en él.

Encontré esta pregunta en SO y traté de adaptar esta respuesta, pero no tuve éxito.

El objective es calcular de forma elemental el squareroot (o la potencia a 1/2) de una matriz scipy.sparse de formato CSR.

¿Qué sugieres?

El siguiente truco funciona para cualquier operación que asigne cero a cero, y solo para esas operaciones, porque solo toca los elementos que no son cero. Es decir, funcionará para sin y sqrt pero no para cos .

Sea X una matriz de RSE …

 >>> from scipy.sparse import csr_matrix >>> X = csr_matrix(np.arange(10).reshape(2, 5), dtype=np.float) >>> XA array([[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.]]) 

Los valores de los elementos que no son cero son X.data :

 >>> X.data array([ 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

que puede actualizar in situ:

 >>> X.data[:] = np.sqrt(X.data) >>> XA array([[ 0. , 1. , 1.41421356, 1.73205081, 2. ], [ 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ]]) 

Actualización En versiones recientes de SciPy, puedes hacer cosas como X.sqrt() donde X es una matriz dispersa para obtener una nueva copia con las raíces cuadradas de los elementos en X