我注意到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]
发布于 2022-06-24 15:29:30
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)
https://stackoverflow.com/questions/72750009
复制