¿Cómo multiplicar por elementos una matriz scipy.sparse por una matriz 1d densa emitida?

Supongamos que tengo una matriz dispersa en 2d. En mi caso de uso real, tanto el número de filas como las columnas son mucho mayores (por ejemplo, 20000 y 50000), por lo tanto, no puede caber en la memoria cuando se usa una representación densa:

>>> 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 suponga que tengo una matriz 1d densa con todos los componentes que no son ceros con tamaño 3 (o 50000 en mi caso de la vida real):

>>> d = np.ones(3) * 3
>>> d
array([ 3.,  3.,  3.])

Me gustaría calcular la multiplicación por elementos de a y d usando la semántica de transmisión habitual de numpy. Sin embargo, las matrices dispersas en scipy son de la matriz np.matrix: el operador '*' se sobrecarga para que se comporte como una matriz de multiplicación en lugar de elementwise-multiply:

>>> a * d
array([ 0., -3.,  0.,  0.,  6.])

Una solución sería hacer un cambio 'a' a la semántica de la 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 puedo hacer eso ya que la llamada a toarray () materializaría la versión densa de 'a' que no cabe en la memoria (y el resultado también será denso):

>>> ssp.issparse(a.toarray())
False

¿Alguna idea de cómo construir esto manteniendo solo estructuras de datos dispersas y sin tener que hacer un bucle de pitón ineficiente en las columnas de 'a'?

Respuestas a la pregunta(3)

Su respuesta a la pregunta