Как действовать поэлементно на матрице типа scipy.sparse.csr_matrix? - PullRequest
6 голосов
/ 18 января 2012

В numpy, если вы хотите вычислить синус каждой записи матрицы (elementise), тогда

a = numpy.arange(0,27,3).reshape(3,3)
numpy.sin(a)

выполнит работу! Если вы хотите, чтобы мощность, скажем, 2 каждой записи

a**2

сделает это.

Но если у вас разреженная матрица, все кажется сложнее. По крайней мере, я не нашел способ сделать это, кроме как перебирать каждую запись в формате lil_matrix и работать с ней.

Я нашел этот вопрос на SO и попытался адаптировать этот ответ , но мне не удалось.

Цель состоит в том, чтобы поэлементно рассчитать квадратный корень (или степень до 1/2) скудной / разреженной матрицы формата CSR.

Что бы вы предложили?

1 Ответ

11 голосов
/ 18 января 2012

Следующая уловка работает для любой операции, которая отображает ноль в ноль, и только для этих операций, потому что она касается только ненулевых элементов.То есть, это будет работать для sin и sqrt, но не для cos.

Пусть X будет некоторой матрицей CSR ...

>>> from scipy.sparse import csr_matrix
>>> X = csr_matrix(np.arange(10).reshape(2, 5), dtype=np.float)
>>> X.A
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.,  9.]])

Не нользначения элементов X.data:

>>> X.data
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])

, которые вы можете обновить на месте:

>>> X.data[:] = np.sqrt(X.data)
>>> X.A
array([[ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ],
       [ 2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ]])

Обновить В последних версиях SciPy вы можете сделатьтакие вещи, как X.sqrt(), где X - это разреженная матрица для получения новой копии с квадратными корнями из элементов в X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...