Как умножить срез разреженной матрицы scipy на константу без изменения разреженности - PullRequest
0 голосов
/ 11 января 2019

Всякий раз, когда я умножаю фрагмент разреженной матрицы на постоянную на месте, я теряю разреженность матрицы, потому что Сципи начинает вычислять 0 * constant для каждой пустой записи, а затем заполняет все пустые записи 0. Это глупо. Как я могу остановить это от этого? Индексы должны быть целыми или логическими. Они не могут использовать :.

Так например

A = scipy.sparse.csr_matrix([[0, 1], [0, 0]])
print(A, '/n' )

A[[0,0],[0,1]] *= -1
print(A)

Результаты в

(0, 1)  1 

(0, 0)  0
(0, 1)  -1

Размер А не должен был измениться.

EDIT: Так как кажется неясным, чего я пытаюсь достичь, я хочу умножить число элементов из разреженной матрицы на константу, не теряя разреженности этой матрицы и не прибегая к операциям, которые являются более дорогими, чем линейные в количество ненулевых элементов в этом количестве элементов, т.е. с использованием разреженной структуры. Так что также не нужно копировать всю разреженную матрицу, что означает, что умножение должно быть на месте.

1 Ответ

0 голосов
/ 11 января 2019

Вы можете попробовать:

A[0, 1] *= -1

Тогда

print(A)

урожайность

(0, 1)  -1

или, по крайней мере, в данном случае просто

print(A * (-1))

дает тот же результат:

(0, 1)  -1

Делая

A[[0,0],[0,1]]

вы выбираете ноль записей, которые затем заполняются; если вы выберете только одну ненулевую запись, как показано выше, она будет работать как положено.

from scipy.sparse import csr_matrix
A = csr_matrix([[0, 1], [5, 0]])

Теперь вы можете просто сделать

print(A * (-1))
(0, 1)  -1
(1, 0)  -5

Вы также можете изменить определенные записи, передавая кортежи

A[(0, 1), (1, 0)] *= -1
print(A)

также вернет желаемый результат:

(0, 1)  -1
(1, 0)  -5

Очевидно, что если вы хотите изменить все ненулевые записи, я бы просто пошел с

A * (-1)
...