scipy稀疏csr_matrix的索引

时间:2014-08-28 10:03:38

标签: python numpy scipy sparse-matrix

我有两个scipy稀疏csr矩阵,它们具有完全相同的形状,但可能具有不同的数据值和nnz值。我现在想要获得一个矩阵的前10个元素,并增加另一个矩阵上相同索引的值。我目前的做法如下:

idx = a.data.argpartition(-10)[-10:]
i, j = matrix.nonzero()

i_idx = i[idx]
j_idx = j[idx]

b[i_idx, j_idx] += 1

我必须采用这种方式的原因是a.data和b.data不一定具有相同数量的元素,因此索引会有所不同。

我现在的问题是我是否可以通过某种方式改善这一点。据我所知,非零过程并不优雅,因为我必须分配两个新数组,而且我对内存非常强硬。我可以通过csr_matrix.indices获取j_indices但是i_indices呢?我能以一种很好的方式使用indptr吗?

对任何提示感到高兴。

1 个答案:

答案 0 :(得分:0)

我不确定“十大要素”是什么意思。我假设如果你有矩阵A和B你想要设置B [i,j] + = 1,如果A [i,j]在A的前10个非零项内(CSR格式)。 我还假设B [i,j]可能为零,这是性能最差的情况,因为你需要修改矩阵的稀疏结构。

CSR不是用于改变稀疏结构的理想格式。这是因为每次新的插入/删除都是O(nnzs)复杂度(假设CSR存储由数组支持 - 通常是这样)。

您可以将DOK格式用于第二个矩阵(您正在修改的矩阵),它提供对元素的O(1)访问。

我没有对此进行基准测试,但我认为你最好选择10 * O(nnzs),当你添加10个新的非零值时,而DOK版本应该需要O(nnzs)来构建矩阵,然后O (1)对于每次插入,最后,O(nnzs)将其转换回CSR(假设需要)。