Python 在scipy稀疏矩阵中直接设置数据成员
我正在构建一个大型CSR稀疏矩阵,它使用了相当多的内存,即使是稀疏格式,所以我希望在创建矩阵时避免复制。我发现的最有效的方法是直接构建压缩的稀疏行表示。但是,类初始值设定项复制了我传递给它的数组,因此我直接设置了数据成员。例如: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) 这似乎可行,但我在
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的情况。如果数据类型正确,它不会复制。