Эффективный способ взять функцию логарифма в разреженной матрице - PullRequest
5 голосов
/ 23 марта 2012

У меня большая разреженная матрица.Я хочу взять log4 для всех элементов в этой разреженной матрице.

Я пытаюсь использовать numpy.log(), но он не работает с матрицами.

Я также могу взять логарифм строка за строкой.Затем я разбил старый ряд новым.

# Assume A is a sparse matrix (Linked List Format) with float values as data
# It is only for one row

import numpy as np
c = np.log(A.getrow(0)) / numpy.log(4)
A[0, :] = c

Это было не так быстро, как я ожидалЕсть ли более быстрый способ сделать это?

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Вы можете изменить атрибут data напрямую:

>>> a = np.array([[5,0,0,0,0,0,0],[0,0,0,0,2,0,0]])
>>> coo = coo_matrix(a)
>>> coo.data
array([5, 2])
>>> coo.data = np.log(coo.data)
>>> coo.data
array([ 1.60943791,  0.69314718])
>>> coo.todense()
matrix([[ 1.60943791,  0.        ,  0.        ,  0.        ,  0.        ,
          0.        ,  0.        ],
        [ 0.        ,  0.        ,  0.        ,  0.        ,  0.69314718,
          0.        ,  0.        ]])

Обратите внимание, что это не работает должным образом, если в разреженном формате есть повторяющиеся элементы (что допустимо в формате COO);журналы будут приниматься индивидуально и log(a) + log(b) != log(a + b).Вы, вероятно, хотите сначала преобразовать в CSR или CSC (что быстро), чтобы избежать этой проблемы.

Вам также, конечно, придется добавить проверки, если разреженная матрица находится в другом формате.И если вы не хотите изменять матрицу на месте, просто создайте новую разреженную матрицу, как вы это сделали в своем ответе, но без добавления 3, потому что здесь это совершенно не нужно.

0 голосов
/ 23 марта 2012

Я думаю, что я решаю это очень простым способом.Очень странно, что никто не мог ответить сразу.

# Let A be a COO_matrix
import numpy as np
from scipy.sparse import coo_matrix
new_data = np.log(A.data+3)/np.log(4) #3 is not so important. It can be 1 too.
A = coo_matrix((new_data, (A.row, A.col)), shape=A.shape)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...