【问题标题】:Finding the top n values in a row of a scipy sparse matrix在 scipy 稀疏矩阵的一行中查找前 n 个值
【发布时间】:2018-09-13 07:19:37
【问题描述】:

我有一个 CSR 格式的 scipy 稀疏矩阵。它是 72665x72665,因此将这个矩阵转换为密集矩阵来执行操作是不切实际的(这个矩阵的密集表示就像 40 gigs)。该矩阵是对称的,大约有 8200 万个非零条目(~1.5%)。

我想做的是,对于每一行,我想获取最大 N 值的索引。如果这是一个 numpy 数组,我会使用 np.argpartition 这样做:

    for row in matrix:
        top_n_idx = np.argpartition(row,-n)[-n:]

我可以为稀疏矩阵做类似的事情吗?

【问题讨论】:

标签: python numpy scipy


【解决方案1】:

从@Paul Panzer 的解决方案中改进。现在它可以处理任何行的值小于 n 的情况。

def top_n_idx_sparse(matrix, n):
    '''Return index of top n values in each row of a sparse matrix'''
    top_n_idx = []
    for le, ri in zip(matrix.indptr[:-1], matrix.indptr[1:]):
        n_row_pick = min(n, ri - le)
        top_n_idx.append(matrix.indices[le + np.argpartition(matrix.data[le:ri], -n_row_pick)[-n_row_pick:]])
    return top_n_idx

【讨论】:

    【解决方案2】:

    直接使用CSR 格式并假设每行中有足够多的正非零可以写:

    for le, ri in zip(matrix.indptr[:-1], matrix.indptr[1:]):
        top_n_idx = matrix.indices[le + np.argpartition(matrix.data[le:ri], -n)[-n:]]
    

    【讨论】:

    • 你能解释一下这段代码 sn-p 是做什么的吗?并且有很多行都是 0,所以如果每一行都需要有“足够”的非零值(什么是足够的?),我认为我的矩阵不满足这个条件。
    • @enumaris 好吧,n 就够了。如果正数少于n,则必须用零填充,这当然是完全可行的,但很乏味,因为它们没有明确存储在csr 矩阵中。而且,从理论上讲,顶部的n 甚至可能会有负面影响,这会导致代码更加繁琐。关于代码在做什么,我得请你阅读csr format(只是第一段),它应该变得清楚。如果不是,我很乐意更详细地解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2018-09-26
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多