К нему можно было подойти так же, как с плотными массивами - для каждой группы выберите нужные столбцы и сумму.Соберите результаты.
In [2]: data = np.asarray([[1, 0, 0], [.8, .2, 0], [0, 1, 0], [0.4, 0.3, 0.3]])
In [3]: M = sparse.csc_matrix(data)
In [4]: M
Out[4]:
<4x3 sparse matrix of type '<class 'numpy.float64'>'
with 7 stored elements in Compressed Sparse Column format>
In [5]: M.A
Out[5]:
array([[1. , 0. , 0. ],
[0.8, 0.2, 0. ],
[0. , 1. , 0. ],
[0.4, 0.3, 0.3]])
In [6]: M[:,[0]].sum(axis=1)
Out[6]:
matrix([[1. ],
[0.8],
[0. ],
[0.4]])
In [7]: M[:,[1,2]].sum(axis=1)
Out[7]:
matrix([[0. ],
[0.2],
[1. ],
[0.6]])
In [8]: res = np.concatenate((Out[6], Out[7]), axis=1)
In [9]: res
Out[9]:
matrix([[1. , 0. ],
[0.8, 0.2],
[0. , 1. ],
[0.4, 0.6]])
Обратите внимание, что sum
производит плотную np.matrix
.sparse
делает это обычно, я думаю, потому что такие суммирования всегда плотнее, чем источник.Сумма будет равна 0, только если все элементы равны 0 (за исключением редкого случая, когда группа ненулевых элементов взаимно отменяет друг друга).
Поскольку индексирование столбца и сумма реализованы как матричные продукты, это можетможно было немного ускорить процесс, создав матрицу, которая выполняет оба действия одновременно.Но это деталь реализации.
Индексирование разреженных матриц происходит довольно медленно (по сравнению с плотными).