2次元の疎配列があるとします。私の実際のユースケースでは、行数と列数の両方がはるかに大きい (たとえば 20000 と 50000) ため、密な表現を使用するとメモリに収まりません。
>>> 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.]])
ここで、サイズが 3 (または実際のケースでは 50000) のすべての非ゼロ コンポーネントを含む密な 1 次元配列があるとします。
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
numpy の通常のブロードキャスト セマンティクスを使用して、a と d の要素ごとの乗算を計算したいと思います。ただし、scipy のスパース行列は np.matrix のものです。「*」演算子は、要素ごとの乗算ではなく行列乗算のように動作するようにオーバーロードされています。
>>> a * d
array([ 0., -3., 0., 0., 6.])
1 つの解決策は、'a' を '*' 演算子の配列セマンティクスに切り替えることです。これにより、期待される結果が得られます。
>>> a.toarray() * d
array([[ 0., 0., 0.],
[ 0., 0., -3.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 6., 0.]])
しかし、 toarray() への呼び出しは、メモリに収まらない「a」の密なバージョンを具体化するため、それを行うことはできません (結果も密になります):
>>> ssp.issparse(a.toarray())
False
まばらなデータ構造のみを保持しながら、「a」の列で非効率的な python ループを実行する必要なく、これを構築する方法はありますか?