如果我想实例化一个大型 bool 稀疏矩阵以稍后在某些索引处分配值,那么初始化它的最佳方法是什么?
例如,如果我想在 MATLAB 上用 10000 个填充元素初始化一个 20000000 X 7000 逻辑稀疏矩阵(不提及非零元素的位置),我将使用以下语法:
Matrix=logical(sparse([],[],[],20000000,7000,10000))
我以后分配非零值没有速度限制。
在Python上,如果我将其初始化为CSR矩阵,则矩阵的创建速度非常快。
Matrix=csr_matrix((20000000, 7000), dtype=bool)
CPU times: user 860 µs, sys: 2.43 ms, total: 3.29 ms
Wall time: 9.72 ms
但是,当我无法有效地将值分配给 CSR_Matrix 时,操作非常慢,并且您会看到内置警告。
如果我尝试将其初始化为 LIL 矩阵:
Matrix=lil_matrix((20000000, 7000), dtype=bool)
CPU times: user 12.4 s, sys: 624 ms, total: 13 s
Wall time: 13 s
或将 csr_matrix 转换为 lil_matrix:
Matrix=csr_matrix((20000000, 7000), dtype=bool)
Matrix=Matrix.tolil()
CPU times: user 26.8 s, sys: 734 ms, total: 27.5 s
Wall time: 27.5 s
初始化需要更多时间。
有什么办法可以加快LIL矩阵的初始化速度吗?如果不是,我可以使用什么稀疏矩阵格式来加速将非零元素分配给此类矩阵?
最佳答案
如果您需要常规增量索引访问,dok_matrix可能是您最好的选择。
在转换为 csc、csr(代数运算通常需要的)等其他东西之前,通常使用这个进行构造(在某些情况下它可以发挥作用)。
编辑:下面的大部分内容都集中在初始化+填充+之后所做的任何事情所需的累积时间。
就您的情况而言:dok_matrix
init 应该非常即时。
...
Allows for efficient O(1) access of individual elements. Duplicates are not allowed. Can be efficiently converted to a coo_matrix once constructed.
话虽如此,这也取决于您的工作流程和被省略的代码。给定一些结构(python-)无循环任务相关工作流程肯定可以击败一次添加一个元素的通用(python-)循环。通常,这涉及 coo_matrix
。
在您的某些工作流程的情况下:您根本没有任何初始化时间,因为您没有先验地创建矩阵,而只是在一批创建矩阵之前收集所需的任何内容。不确定它如何适合您的计算模型(这有点奇怪:初始化时间有限;进一步使用免费)
关于python - 实例化大型稀疏矩阵以进行赋值操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59460230/