Суммирование разреженных строк матрицы по группам столбцов - PullRequest
0 голосов
/ 13 февраля 2019

У меня скудная разреженная матрица в формате coo:

from scipy.sparse import coo_matrix
data = np.asarray([[1, 0, 0], [.8, .2, 0], [0, 1, 0], [0.4, 0.3, 0.3]])
data
array([[1. , 0. , 0. ],
       [0.8, 0.2, 0. ],
       [0. , 1. , 0. ],
       [0.4, 0.3, 0.3]])
sparse_matrix = coo_matrix(data)

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

Пример:

labels = ["a", "b", "b"] Ожидаемый результат:

1,   0
.8, .2
0,   1
.4, .6

1 Ответ

0 голосов
/ 13 февраля 2019

К нему можно было подойти так же, как с плотными массивами - для каждой группы выберите нужные столбцы и сумму.Соберите результаты.

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 (за исключением редкого случая, когда группа ненулевых элементов взаимно отменяет друг друга).

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

Индексирование разреженных матриц происходит довольно медленно (по сравнению с плотными).

...