我有一个CSR格式的scipy稀疏矩阵。这是72665x72665因此将此矩阵转换为密集矩阵以执行操作是不切实际的(此矩阵的密集表示类似于40演出)。矩阵是对称的,并且具有大约8,200万个非零项(~1.5%)。
我希望能够做的是,对于每一行,我想得到最大N值的索引。如果这是一个numpy数组,我会使用np.argpartition
这样做:
for row in matrix:
top_n_idx = np.argpartition(row,-n)[-n:]
我是否可以为稀疏矩阵做类似的事情?
答案 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