Вычитание вектора из ненулевых значений разреженной матрицы - PullRequest
2 голосов
/ 05 апреля 2020

Я хочу вычесть вектор из ненулевых значений разреженной матрицы, например,

     [,1] [,2] [,3] [,4]
[1,]    0    0    4    0
[2,]    0    5    0    3
[3,]    1    2    0    0

, а вот вектор, который я пытаюсь вычесть:

[1 2 3]

, так В итоге мне нужно:

     [,1] [,2] [,3] [,4]
[1,]    0    0    3    0
[2,]    0    3    0    1
[3,]   -2   -1    0    0

Я сделал это с помощью sparse_matrix.A, но он использует мою память, когда я использую весь набор данных.

PS Размеры матрицы слишком велики, и я не хочу использовать петли!

1 Ответ

1 голос
/ 05 апреля 2020

Давайте начнем с постановки задачи и используем csr_matrix из scipy.sparse для построения разреженной матрицы:

from scipy.sparse import csr_matrix

a = np.array([[0, 0, 4, 0],
              [0, 5, 0, 3],
              [1, 2, 0, 0]])

a_sp = csr_matrix(a, dtype=np.int8)
b = np.array([1,2,3])

Мы можем найти ненулевые местоположения разреженную матрицу с csr_matrix.nonzero и используйте координаты row для индексации плотного массива 1d. Затем вычтите соответствующие координаты nonzero, указав в разреженной матрице:

nz = a_sp.nonzero()
a_sp[nz] -= b[nz[0]]

print(a_sp.toarray())

array([[ 0,  0,  3,  0],
       [ 0,  3,  0,  1],
       [-2, -1,  0,  0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...