Сумма по строкам в scipy.sparse.csr_matrix
У меня есть большая csr_matrix, и я хочу добавить поверх строк и получить новую csr_matrix с тем же количеством столбцов, но с уменьшенным количеством строк. (Контекст: матрица представляет собой матрицу термина документа, полученную из sklearn CountVectorizer, и я хочу иметь возможность быстро комбинировать документы в соответствии с кодами, связанными с этими документами)
Для минимального примера, это моя матрица:
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse import vstack
row = np.array([0, 4, 1, 3, 2])
col = np.array([0, 2, 2, 0, 1])
dat = np.array([1, 2, 3, 4, 5])
A = csr_matrix((dat, (row, col)), shape=(5, 5))
print A.toarray()
[[1 0 0 0 0]
[0 0 3 0 0]
[0 5 0 0 0]
[4 0 0 0 0]
[0 0 2 0 0]]
Нет, скажем, я хочу новую матрицуB
в котором строки (1, 4) и (2, 3, 5) объединяются путем их суммирования, что будет выглядеть примерно так:
[[5 0 0 0 0]
[0 5 5 0 0]]
И должен быть снова в разреженном формате (потому что реальные данные, с которыми я работаю, большие). Я попытался сложить по кусочкам матрицы и затем сложить ее:
idx1 = [1, 4]
idx2 = [2, 3, 5]
A_sub1 = A[idx1, :].sum(axis=1)
A_sub2 = A[idx2, :].sum(axis=1)
B = vstack((A_sub1, A_sub2))
Но это дает мне суммированные значения только для ненулевых столбцов в срезе, поэтому я не могу объединить его с другими срезами, потому что количество столбцов в суммированных срезах различно.
Я чувствую, что должен быть легкий способ сделать это. Но я не смог найти ни одного обсуждения этого онлайн или в документации. Чего мне не хватает?
Спасибо за помощь