【问题标题】:Sparse matrix with fast access快速访问的稀疏矩阵
【发布时间】:2017-12-05 23:34:00
【问题描述】:

在处理大型 SciPy CSR 稀疏矩阵时,我注意到对矩阵进行切片以从矩阵中获取单行非常慢,因为它似乎在复制。

有没有什么方法可以制作一个稀疏矩阵来引用现有行而不是复制它,也许有比 CSR 矩阵更合适的实现?

我的实现需要的是快速查找元素和行以及快速查找向量的所有非零索引。我永远不需要以任何方式更改矩阵或对矩阵执行其他操作。

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    您可以利用 CSR 表示直接对底层数组进行切片并与新的 CSR 矩阵共享数据:

    mat = # some CSR matrix
    i = # the index of whatever row you want
    start, stop = mat.indptr[i], mat.indptr[i+1]
    noncopy_row_i = scipy.sparse.csr_matrix((mat.data[start:stop],
                                             mat.indices[start:stop],
                                             numpy.array([0, stop-start])),
                                            shape=(1, mat.shape[1]))
    

    【讨论】:

    • 我针对mat[i,:] 测试了您的功能。时序为 69.3 µs v 107 µs,这是一个适度的改进。 lil 格式的索引为 78 µs。
    • 如果你使用你的代码只返回dataindices,而不是构造一个新的csr_matrix,它会快得多,大约2 µs。为lil 格式提取row 元素时,同样的加速也适用。
    • 我决定这样做,只使用索引而不构造新的 csr_matrix。通过这些优化,我的算法总共运行了大约 10 微秒而不是 1 毫秒,这对于现在来说已经足够了,谢谢你们! :-)
    【解决方案2】:

    Numpy 支持不同类型的 os sparces 矩阵:https://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information

    可能是coo_matrix 将提供更快的元素查找,但您也可以放松一些其他操作。我认为最好的方法是对您的数据和算法进行基准测试。

    【讨论】:

    猜你喜欢
    • 2023-03-25
    • 2017-04-21
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多