【问题标题】:Summing sparse matrix rows by column groups按列组对稀疏矩阵行求和
【发布时间】:2019-02-14 01:27:59
【问题描述】:

我有一个 coo 格式的 scipy 稀疏矩阵:

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

【问题讨论】:

    标签: python scipy sparse-matrix


    【解决方案1】:

    可以像使用密集数组一样接近 - 对于每个组,选择所需的列,然后求和。收集结果。

    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(除了少数非零元素相互抵消的情况)。

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

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

    【讨论】:

    • 感谢您的建议,但我真的希望始终保持矩阵稀疏,以防止以后出现内存错误。我现在选择的解决方案是为每个组做矩阵产品,然后将每个结果列添加到一个空的 lil 格式矩阵。这样我就可以一直保持矩阵稀疏。
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2012-01-10
    • 2019-11-04
    • 2018-03-10
    • 2015-02-07
    • 2012-05-15
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多