我试图找到一种有效的方法,让我通过一些常数值增加稀疏矩阵的前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
实际上排序似乎很快,问题在于我的最终循环,我通过排序索引索引来增加值。希望有人知道如何加快速度。
答案 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