【发布时间】:2017-12-05 23:34:00
【问题描述】:
在处理大型 SciPy CSR 稀疏矩阵时,我注意到对矩阵进行切片以从矩阵中获取单行非常慢,因为它似乎在复制。
有没有什么方法可以制作一个稀疏矩阵来引用现有行而不是复制它,也许有比 CSR 矩阵更合适的实现?
我的实现需要的是快速查找元素和行以及快速查找向量的所有非零索引。我永远不需要以任何方式更改矩阵或对矩阵执行其他操作。
【问题讨论】:
在处理大型 SciPy CSR 稀疏矩阵时,我注意到对矩阵进行切片以从矩阵中获取单行非常慢,因为它似乎在复制。
有没有什么方法可以制作一个稀疏矩阵来引用现有行而不是复制它,也许有比 CSR 矩阵更合适的实现?
我的实现需要的是快速查找元素和行以及快速查找向量的所有非零索引。我永远不需要以任何方式更改矩阵或对矩阵执行其他操作。
【问题讨论】:
您可以利用 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。
data和indices,而不是构造一个新的csr_matrix,它会快得多,大约2 µs。为lil 格式提取row 元素时,同样的加速也适用。
Numpy 支持不同类型的 os sparces 矩阵:https://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information
可能是coo_matrix 将提供更快的元素查找,但您也可以放松一些其他操作。我认为最好的方法是对您的数据和算法进行基准测试。
【讨论】:
nonzero 方法 - docs.scipy.org/doc/scipy/reference/generated/…
nonzero 方法本质上返回coo 格式的row 和col 属性。检查它的源代码。