SciPy稀疏矩阵在传入函数时未修改

kwvwclae  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(127)

我注意到SciPy稀疏矩阵和numpy数组在传递到函数时被修改的方式明显不一致。特别是,我想知道是否有人能解释为什么下面的a稀疏矩阵没有被func全局修改,而b数组是:

from scipy import sparse
import numpy as np

def func(m):
    m += m

a = sparse.identity(2)
b = np.array([1, 2])

print(a.todense()) # [[1,0],[0,1]]
func(a)
print(a.todense()) # Still [[1,0],[0,1]]. Why???

print(b) # [1, 2]
func(b)
print(b) # Now [2, 4]
lbsnaicq

lbsnaicq1#

In [11]: arr = np.array([[1,0],[2,3]])
In [12]: id(arr)
Out[12]: 1915221691344

In [13]: M = sparse.csr_matrix(arr)
In [14]: id(M)
Out[14]: 1915221319840

In [15]: arr += arr

In [16]: id(arr)
Out[16]: 1915221691344

+=在阵列中就地操作

In [17]: M += M    
In [18]: id(M)
Out[18]: 1915221323200

对于稀疏矩阵,它会创建一个新的稀疏矩阵对象,而不会就地修改矩阵。
对于此操作,可以就地修改data属性:

In [20]: M.data
Out[20]: array([2, 4, 6], dtype=int32)

In [21]: M.data += M.data

In [22]: M.A
Out[22]: 
array([[ 4,  0],
       [ 8, 12]], dtype=int32)

但是一般来说,在稀疏矩阵中添加一些东西可以修改它的稀疏性。稀疏矩阵开发人员认为,在不创建新矩阵的情况下,这样做是不可能的,或者是不划算的(编程或运行时间?)。
虽然稀疏矩阵是在np.matrix子类上模式化的,但它不是ndarray的子类,并且没有义务以完全相同的方式表现。

In [30]: type(M).__mro__
Out[30]: 
(scipy.sparse.csr.csr_matrix,
 scipy.sparse.compressed._cs_matrix,
 scipy.sparse.data._data_matrix,
 scipy.sparse.base.spmatrix,
 scipy.sparse.data._minmax_mixin,
 scipy.sparse._index.IndexMixin,
 object)

相关问题