Предположим, у меня есть 2d разреженный массив.В моем реальном сценарии использования число строк и столбцов намного больше (скажем, 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.]])
Теперь предположим, что у меня плотный массив 1dсо всеми ненулевыми компонентами с размером 3 (или 50000 в моем случае из реальной жизни):
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
Я хотел бы вычислить поэлементное умножение a и d, используя обычную семантику широковещания numpy.Тем не менее, разреженные матрицы в scipy принадлежат np.matrix: оператор '*' перегружен, чтобы он вел себя как матричное умножение вместо поэлементного умножения:
>>> a * d
array([ 0., -3., 0., 0., 6.])
Одним из решений было бысделать '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
Любая идея, как построить это, сохраняя только разреженные структуры данных и не делая неэффективный цикл Python настолбцы «а»?