在scipy稀疏矩阵的行中查找前n个值

时间:2018-03-10 09:02:34

标签: python numpy scipy

我有一个CSR格式的scipy稀疏矩阵。这是72665x72665因此将此矩阵转换为密集矩阵以执行操作是不切实际的(此矩阵的密集表示类似于40演出)。矩阵是对称的,并且具有大约8,200万个非零项(~1.5%)。

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

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

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

2 个答案:

答案 0 :(得分:1)

直接使用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:]]

答案 1 :(得分: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