Эта функция не является встроенной, но если она вам действительно нужна, вы сможете написать свой собственный класс 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()
Это оставляет нулевые элементы в покое, но, как указано выше, это позволяет обрабатывать константу отдельно.