按列组汇总稀疏矩阵行

时间:2019-02-13 16:13:55

标签: python scipy sparse-matrix

我有一个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 :(得分:0)

可以使用密集数组来进行处理-对于每个组,选择所需的列并求和。收集结果。

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(少数情况下,一堆非零相互抵消)。

由于列索引和总和都被实现为矩阵乘积,因此可以通过构造一个同时执行两个动作的矩阵来加快处理速度。但这是一个实现细节。

稀疏矩阵的索引编制非常慢(与密集矩阵相比)。