增加稀疏矩阵中前k个元素的值

时间:2014-07-21 14:50:29

标签: python sorting numpy scipy sparse-matrix

我试图找到一种有效的方法,让我通过一些常数值增加稀疏矩阵的前k值。我目前正在使用以下代码,这对于非常大的矩阵来说非常慢:

a = csr_matrix((2,2)) #just some sample data
a[1,1] = 3.
a[0,1] = 2.

y = a.tocoo()
idx = y.data.argsort()[::-1][:1] #k is 1
for i, j in izip(y.row[idx], y.col[idx]):
    a[i,j] += 1

实际上排序似乎很快,问题在于我的最终循环,我通过排序索引索引来增加值。希望有人知道如何加快速度。

1 个答案:

答案 0 :(得分:5)

通过直接修改a.data而不是迭代行/列索引并修改单个元素,你可能会加快速度:

idx = a.data.argsort()[::-1][:1] #k is 1
a.data[idx] += 1

这也节省了从CSR转换 - > COO

更新

正如@WarrenWeckesser正确地指出的那样,由于您只对k最大元素的索引感兴趣并且您不关心它们的顺序,因此您可以使用argpartition而不是{{ 1}}。 <{1}}很大时,这可以快得多。

例如:

argsort