Python 在scipy稀疏矩阵中直接设置数据成员

Python 在scipy稀疏矩阵中直接设置数据成员,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,我正在构建一个大型CSR稀疏矩阵,它使用了相当多的内存,即使是稀疏格式,所以我希望在创建矩阵时避免复制。我发现的最有效的方法是直接构建压缩的稀疏行表示。但是,类初始值设定项复制了我传递给它的数组,因此我直接设置了数据成员。例如: from scipy import sparse m = sparse.csr_matrix((5,5)) m.data = np.arange(5) m.indices = np.arange(5) m.indptr = np.arange(6) 这似乎可行,但我在

我正在构建一个大型CSR稀疏矩阵,它使用了相当多的内存,即使是稀疏格式,所以我希望在创建矩阵时避免复制。我发现的最有效的方法是直接构建压缩的稀疏行表示。但是,类初始值设定项复制了我传递给它的数组,因此我直接设置了数据成员。例如:

from scipy import sparse
m = sparse.csr_matrix((5,5))
m.data = np.arange(5)
m.indices = np.arange(5)
m.indptr = np.arange(6)
这似乎可行,但我在文档中没有找到它,我想知道它是否受支持,它是否破坏了我没有尝试过的东西

另外,了解我是否可以使用memmapped数组而不存在任何问题,或者是否可以为索引使用不同的整数数据类型也是很有用的

编辑:

接受的答案表明,只要索引类型正确,就不会发生复制。我已经检查了uu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

[…]从某处获取形状和数据 m=sparse.csr_matrixshape,dtype=data.dtype index=np.empty…,dtype=m.index.dtype indptr=np.empty…,dtype=m.indptr.dtype […]填充指数和indptr m、 数据=数据 m、 指数=指数 m、 indptr=indptr 还可能执行以下一项或两项操作: m、 是否已排序\u索引=真 m、 has_canonical_format=True
下面是一个在不复制定义数组的情况下生成稀疏矩阵的示例:

In [191]: data=np.arange(5) 
     ...: indices=np.arange(5).astype('int32') 
     ...: indptr=np.arange(6).astype('int32')                                                  
In [192]: M = sparse.csr_matrix((data,indices,indptr))                                         
In [193]: data.__array_interface__['data'], M.data.__array_interface__['data']                 
Out[193]: ((55897168, False), (55897168, False))
In [194]: indices.__array_interface__['data'], M.indices.__array_interface__['data']           
Out[194]: ((70189040, False), (70189040, False))
In [195]: indptr.__array_interface__['data'], M.indptr.__array_interface__['data']             
Out[195]: ((56184432, False), (56184432, False))
我写这篇文章的时候就考虑到了“初始化”。还可以查看check_format方法,查看它检查一致性的内容。

相关的uu init_uu是_cs_矩阵。当您直接传递数据、索引和indptr时,就是lenarg1==3的情况。如果数据类型正确,它不会复制。