У меня есть большая csr_matrix, и я хочу добавить строки и получить новую csr_matrix с таким же количеством столбцов, но с уменьшенным числом строк. (Контекст: Матрица представляет собой документ, срок матрица, полученная из sklearn CountVectorizer, и я хочу, чтобы иметь возможность быстро объединять документы в соответствии с кодами, связанными с этими документами)Сумма строк в scipy.sparse.csr_matrix
Для минимального примера, это моя матрица:
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))
Но это дает мне суммированные до значения только для ненулевых столбцов в срезе, так что я не могу объединить его с другими поскольку количество столбцов в суммированных срезах различно.
Я чувствую, что должен быть простой способ сделать это. Но я не мог найти никакого обсуждения этого онлайн или в документации. Что мне не хватает?
Спасибо за вашу помощь
Привет, спасибо за ваш ответ. Я не могу преобразовать матрицу А в массив, потому что она большая. Но я думаю, что я могу сделать матрицу размножаться непосредственно на разреженной матрице? –
А вот последний «toarray» - это просто показать, что мы получаем правильный ответ, когда мы умножаем 'S * A' для этого небольшого примера - я не имел в виду, что вы конвертируете в плотный массив в свой код. Я добавлю комментарий. – YXD
Отлично, спасибо. Это действительно элегантное решение –