Supongamos que tengo una 2d matriz dispersa. En mi verdadero caso de uso tanto en el número de filas y columnas son mucho más grandes (digamos, 20000 y 50000), por tanto, no puede caber en la memoria cuando se utiliza una representación densa:¿Cómo se multiplica por elementos una matriz scipy.sparse por una matriz 1d densa emitida?
>>> import numpy as np
>>> import scipy.sparse as ssp
>>> a = ssp.lil_matrix((5, 3))
>>> a[1, 2] = -1
>>> a[4, 1] = 2
>>> a.todense()
matrix([[ 0., 0., 0.],
[ 0., 0., -1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 2., 0.]])
Ahora supongamos que tengo una matriz 1d densa con toda componentes que no son ceros con un tamaño de 3 (o 50.000 en mi caso la vida real):
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
me gustaría para calcular la multiplicación elementwise de a y d usando la semántica de difusión habituales de numpy. Sin embargo, matrices dispersas en scipy son de la np.matrix: el operador '*' está sobrecargado para que se comporte como una matriz de multiplicación en lugar de la elementwise-multiplican:
>>> a * d
array([ 0., -3., 0., 0., 6.])
Una solución sería hacer ' un' interruptor a la semántica de matriz para el operador '*', que daría el resultado esperado:
>>> a.toarray() * d
array([[ 0., 0., 0.],
[ 0., 0., -3.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 6., 0.]])
Pero no puede hacer eso ya que la llamada a toArray() se materializaría la versión densa de 'a' y no cabe en la memoria (y el resultado también será denso):
>>> ssp.issparse(a.toarray())
False
¿Alguna idea de cómo crear esto manteniendo solo las estructuras de datos dispersas y sin tener que hacer un ciclo de python ineficiente en las columnas de 'a'?
Si 'd' es una matriz dispersa del mismo tamaño que' a' puede utilizar 'a.multiply (d)'. ¿Quizás puedas hacer una 'd' que tenga N filas de longitud y pasar por N filas de' a' a la vez? – mtrw
Pero d es denso y no se puede emitir explícitamente en la memoria para satisfacer los requisitos de formas múltiples. Looping sobre un lote es una opción, pero me parece un poco hackish. Hubiera pensado que había una manera vainilla vectorizada/scipy de hacer esto sin un ciclo de Python. – ogrisel
Supongo que el problema es que desea la representación de una matriz (dispersa) pero el funcionamiento mulitply de una matriz. Creo que vas a tener que tirar tu propia desafortunadamente. – mtrw