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'?