将稀疏矩阵限制为scipy中的子空间

Art*_* B. 2 python scipy sparse-matrix

说我有一个方形的NxN crs矩阵辣.我想通过保持M个索引(由N个布尔数组给出,其中M为真)将该矩阵限制为子空间.这应该给我一个MxM稀疏矩阵.

因此,显然,一种方法是将系数提取为数据数组和两个坐标数组,并使用排序重新编号坐标.这很痛苦,有点难看.

是不是有功能,或者是图书馆调用呢?

unu*_*tbu 5

如果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.