python - 实例化大型稀疏矩阵以进行赋值操作

标签 python matlab numpy scipy sparse-matrix

如果我想实例化一个大型 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/

相关文章:

python - Reportlab:Platypus 是否可以有内部链接?

MATLAB 通过另一个矩阵中的索引进行索引

c++ - 具有大变量的高阶贝塞尔函数计算

python - 序列化 numpy 数组的元组

python - 打印 unicode 字符串在 python 3.2 中有效,但在 2.7 中无效

python - 如何将两个 Pandas DataFrame 与不同的、不重叠的 MultiIndex 结合起来?

python - 计数器允许重复

matlab - 在 MATLAB 中使用 for 循环绘制图形

python - 对于给定的稀疏矩阵,如何将其与给定的二进制值向量相乘

python - 在 numba.jit 装饰器中使用并行选项使函数给出错误的结果