Como multiplicar por elementos uma matriz scipy.sparse por uma matriz 1d densa transmitida?

Suponha que eu tenha uma matriz esparsa 2D. No meu caso real, tanto o número de linhas quanto de colunas são muito maiores (digamos 20000 e 50000), portanto, não cabe na memória quando uma representação densa é usada:

>>> 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.]])

Agora, suponha que eu tenha uma matriz 1d densa com todos os componentes que não sejam zeros com tamanho 3 (ou 50000 no meu caso da vida real):

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

Eu gostaria de calcular a multiplicação elementar de a e d usando a semântica usual de transmissão de numpy. No entanto, matrizes esparsas no scipy são do np.matrix: o operador '*' está sobrecarregado para se comportar como uma multiplicação de matrizes em vez da multiplicação por elementos:

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

Uma solução seria fazer 'a' alternar para a semântica da matriz para o operador '*', o que daria o resultado esperado:

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

Mas não posso fazer isso, pois a chamada para a matriz () materializaria a versão densa de 'a' que não cabe na memória (e o resultado também será denso):

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

Alguma idéia de como criar isso, mantendo apenas estruturas de dados esparsas e sem precisar fazer um loop python ineficiente nas colunas de 'a'?

questionAnswers(3)

yourAnswerToTheQuestion