Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为赋值操作实例化大型稀疏矩阵_Python_Matlab_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

Python 为赋值操作实例化大型稀疏矩阵

Python 为赋值操作实例化大型稀疏矩阵,python,matlab,numpy,scipy,sparse-matrix,Python,Matlab,Numpy,Scipy,Sparse Matrix,如果我想实例化一个大型布尔稀疏矩阵,以便稍后在某些索引处赋值,那么初始化它的最佳方法是什么 例如,如果我想在MATLAB上使用10000个填充元素(不提及非零元素的位置)初始化20000000 X 7000逻辑稀疏矩阵,我将使用以下语法: Matrix=logical(sparse([],[],[],20000000,7000,10000)) 我在以后分配非零值时没有速度限制 在Python上,如果我将其初始化为CSR矩阵,那么矩阵的创建速度非常快 Matrix=csr_matrix((200

如果我想实例化一个大型布尔稀疏矩阵,以便稍后在某些索引处赋值,那么初始化它的最佳方法是什么

例如,如果我想在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_矩阵时,操作非常缓慢,您会看到内置的警告

如果我尝试将其初始化为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_矩阵转换为lil_矩阵:

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矩阵的初始化速度?如果不是,我可以使用什么稀疏矩阵格式来加速将非零元素分配给此类矩阵

如果您需要常规增量索引访问,这可能是您的最佳选择

在转换为其他类似csc、csr(通常用于代数运算)的东西之前,通常会使用这个函数进行构造(在某些情况下它会发光)

编辑:以下大部分内容主要关注初始化+填充+之后所做的任何事情所需的累积时间

就您的情况而言:
dok_matrix
init应该是即时的

允许对单个元件进行有效的O(1)访问。不允许重复。一旦构造,就可以有效地转换为coo_矩阵

这就是说,这也取决于你的工作流程和代码,这被省略了。给定某种结构(python-)的无环任务依赖工作流肯定可以击败泛型(python-)循环,一次添加一个元素。通常,这涉及到
coo\u矩阵


在某些工作流中:您根本没有任何初始时间,因为您没有预先创建矩阵,而只是在一批创建矩阵之前收集所需的内容。不确定这是否适合您的计算模型(这有点奇怪:init时间有限;进一步使用是免费的)

我在几年前使用过MATLAB稀疏。那时,您使用创建了一个稀疏矩阵

S = sparse(i,j,v,m,n)
其中
i,j,v
其中矩阵识别所有非零值。为更多非零预先分配“空间”的额外
nz
参数不存在

scipy
中,等效值为

S = sparse.csc_matrix((v, (i,j)), m, n)
同样,
v、i、j是完全定义的数组。没有任何
nz
preallocation选项。事实上,考虑到属性是如何存储的,我看不出预分配是如何工作的或是如何有益的

正如您所发现的,尝试使用
csc/csr
格式定义非零值的速度很慢,并且会产生警告
lil/dok
旨在加快迭代加法

csr
创建时间取决于初始非零值的数量,仅略微取决于形状(数组大小取决于行数)。通常情况下,我们不担心
lil
的初始化时间,但是对于20000000行,我可以理解为什么需要时间。它必须创建两个带有空列表元素的对象数据类型数组


无论如何,尽量避免增量定义。从源代码中创建
i、j、v
数组,然后构建矩阵。

您所说的
初始化是什么意思?非零值的来源是什么?@hpaulj Instantiate是正确的单词,抱歉。我的非零值来源于外部HDF5文件。