首页 文章

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

提问于
浏览
1

我有一个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

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

    改进@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
    

相关问题