【问题标题】:Indices of scipy sparse csr_matrixscipy sparse csr_matrix 的索引
【发布时间】:2014-10-22 03:41:59
【问题描述】:

我有两个形状完全相同但数据值和 nnz 值可能不同的 scipy 稀疏 csr 矩阵。我现在想要获取一个矩阵的前 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 吗?

欢迎任何提示。

【问题讨论】:

  • indptr 每行有一个值(加 1)。它指示每一行在dataindices 数组中的起始位置。您可以进行数学运算,也可以转换数组tocoo()。然后rowcol 有你想要的值。但请注意,有一些关于索引可能未排序的警告。
  • 查看nonzero的代码。 If 将矩阵转换为coo 并返回rowcol
  • top 10 elements 是否表示 CSR 格式中的前 10 个非零值?

标签: python numpy scipy sparse-matrix


【解决方案1】:

我不确定“前 10 个元素”是什么意思。我假设如果你有矩阵 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(假设需要这样做)。

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 2022-01-26
    • 2012-02-15
    • 2020-02-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多