scipy.sparse значение по умолчанию - PullRequest
9 голосов
/ 06 июня 2011

Формат разреженной матрицы (dok) предполагает, что значения ключей, отсутствующих в словаре, равны нулю. Есть ли способ заставить его использовать значение по умолчанию, отличное от нуля?

Кроме того, есть ли способ вычислить лог разреженной матрицы (сродни np.log в обычной матрице с нулевыми значениями)

1 Ответ

8 голосов
/ 06 июня 2011

Эта функция не является встроенной, но если она вам действительно нужна, вы сможете написать свой собственный класс dok_matrix или подкласс Scipy.Реализация Scipy здесь: https://github.com/scipy/scipy/blob/master/scipy/sparse/dok.py По крайней мере в тех местах, где совершаются вызовы dict.*, необходимо изменить значение по умолчанию - и, возможно, есть некоторые другие изменения, которые необходимо сделать.

Однако я бы попытался переформулировать проблему, чтобы она не была нужна.Например, если вы выполняете линейную алгебру, вы можете выделить постоянный член и вместо этого сделать

from scipy.sparse.linalg import LinearOperator
A = whatever_dok_matrix_minus_constant_term
def my_matvec(x):
    return A*x + constant_term * x.sum()
op = LinearOperator(A.shape, matvec=my_matvec)

Для большинства процедур линейной алгебры (например, итерационные решатели) вы можете передать op вместо A.

Что касается матричного логарифма: логарифм разреженной матрицы (как в scipy.linalg.logm) обычно плотный, поэтому сначала нужно просто преобразовать матрицу в плотную, а затем вычислить логарифм как обычно.Насколько я вижу, использование разреженной матрицы не дало бы прирост производительности.Если вам нужно только вычислить произведение вектора и логарифма, вектора log(A) * v, может помочь некоторый метод Крылова.

Если вы, ОТОХ, хотите вычислить логарифм поэлементно, вы можете изменить .data атрибут напрямую (доступно, по крайней мере, в COO, CSR и CSC)

x = A.tocoo()
x.data = np.log(x.data)
A = x.todok()

Это оставляет нулевые элементы в покое, но, как указано выше, это позволяет обрабатывать константу отдельно.

...