Art*_* B. 2 python scipy sparse-matrix
说我有一个方形的NxN crs矩阵辣.我想通过保持M个索引(由N个布尔数组给出,其中M为真)将该矩阵限制为子空间.这应该给我一个MxM稀疏矩阵.
因此,显然,一种方法是将系数提取为数据数组和两个坐标数组,并使用排序重新编号坐标.这很痛苦,有点难看.
是不是有功能,或者是图书馆调用呢?
如果y是稀疏矩阵:
In [56]: y
Out[56]:
<200x200 sparse matrix of type '<type 'numpy.float64'>'
with 197 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)
并且mask是一维布尔数组:
In [57]: mask.dtype
Out[57]: dtype('bool')
In [58]: mask.shape
Out[58]: (200,)
Run Code Online (Sandbox Code Playgroud)
然后y[mask][:, mask]产生所需的子矩阵:
In [59]: y[mask][:, mask]
Out[59]:
<103x103 sparse matrix of type '<type 'numpy.float64'>'
with 51 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)
NumPy还有一个函数np.ix_可以在这里用来构造所需的索引,但速度相当慢:
In [64]: y[np.ix_(mask, mask)]
Out[64]:
<103x103 sparse matrix of type '<type 'numpy.float64'>'
with 51 stored elements in Compressed Sparse Row format>
In [65]: %timeit y[np.ix_(mask, mask)]
10 loops, best of 3: 59.8 ms per loop
In [66]: %timeit y[mask][:, mask]
1000 loops, best of 3: 494 µs per loop
Run Code Online (Sandbox Code Playgroud)
请注意这两个y[mask][:, mask]和y[np.ix_(mask, mask)]返回新的稀疏矩阵,不享有原来的稀疏矩阵.由于您选择任意行和列,因此无法返回视图.
但是,由于y[np.ix_(mask, mask)]只使用一个索引,因此对其进行赋值调用y.__setitem__(方法y),从而影响y:
y[np.ix_(mask, mask)] = other
Run Code Online (Sandbox Code Playgroud)
相反,因为y[mask]是一个独立y于分配的矩阵
y[mask][:, mask] = other
Run Code Online (Sandbox Code Playgroud)
调用__setitem__这个独立矩阵的方法,因此没有影响y.