我有一个CSR格式的scipy稀疏矩阵,大小为72665x72665,因此将该矩阵转换为稠密矩阵进行运算是不切实际的(该矩阵的稠密表示大约为40千兆字节)。该矩阵是对称的,大约有8200万个非零元素(约1.5%)。
我想做的是,对于每一行,我想得到最大的N个值的索引。如果这是一个numpy数组,我会用np.argpartition
这样做:
for row in matrix:
top_n_idx = np.argpartition(row,-n)[-n:]
对于稀疏矩阵,有没有类似的方法?
2条答案
按热度按时间kd3sttzy1#
改进了Paul Panzer的解决方案。现在它可以处理任何行的值小于n的情况。
"它能做什么"
matrix.indptr
给出了存储在data
数组中的每一行的开始索引。因此(lr, ri)
是每一行中非零值的数据索引的范围。matrix.data[le:ri]
给出了该行的非零值。将其传递给np.argpartition(..., -n_row_pick)
将给出本地索引,该本地索引将从后面对最大的n_row_pick
元素的行进行排序。[-n_row_pick:]
选择这些局部索引。然后le +
将这些局部索引移回到数据数组中的索引。最后,将其传递给matrix.indices
以获得矩阵空间中最大的n值索引。suzh9iv82#
直接使用
CSR
并假设每行中有足够多的正非零值,您可以写出: