Scipy 稀疏矩阵,复制参数

3

在构建Scipy稀疏数组时,copy参数的功能是什么?

scipy.sparse.lil_matrix(arg1, shape=None, dtype=None, copy=False)

它似乎什么也没有做!

当我从另一个矩阵构建稀疏矩阵并明确设置copy=False时,更改一个矩阵不会更改另一个矩阵。

import scipy.sparse as sp
import numpy as np
A = sp.csc_matrix(np.array([[1,0],[0,0]]))
B = sp.csr_matrix(A, copy=False)
B[1,1] = 1 #editing B should change A but it does not 
print A.data, B.data #these values are different

谢谢

1个回答

2

CSC和CSR矩阵都是用三个一维数组来表示的。这三个数组通常对于不同的格式是不同的,即使它们表示相同的数据。因此,你无法有两个稀疏矩阵对象指向相同的数据但以不同的格式访问它。

copy参数可以让你拥有两个相同格式的稀疏矩阵对象指向相同的数据。例如:

a = sps.csr_matrix([[1, 0], [0, 0]])
b = sps.csr_matrix(a, copy=False)

>>> a.data
array([1])
>>> b.data
array([1])
>>> a[0, 0] = 2
>>> a.data
array([2])
>>> b.data
array([2])

这也有局限性,例如针对CSR(和CSC)格式,打破稀疏结构将破坏数据的共通性,因为它需要实例化新数组,而不仅仅是更改现有数组中的值。
>>> a[1, 1] = 5
>>> a.data
array([2, 5])
>>> b.data
array([2])

也许我不理解del的工作原理,但以下代码对我来说意味着即使指定了copy=False,数据也会被复制: print S.todense(); S2 = sp.sparse.csr_matrix(S,copy=False); del S.data,S.indices,S.indptr,S; print S2.todense() # <-- 与第一个打印结果相同; - gerowam
1
Python 为每个对象都保留有一个引用计数。当您使用 del S.data 时,相应的数组的引用计数将减少一,并且 .data 属性将从对象中移除。如果没有其他对象指向此相同的数组,则引用计数将降至零,它将被垃圾回收。但是,如果其他对象仍然指向它,则该数组将不会被垃圾回收,即使您已经摆脱了属性并无法通过 S 访问它,也会保留给 S2 使用。 - Jaime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接