稀疏矩阵的条件切片

时间:2018-09-07 05:31:00

标签: scipy sparse-matrix

很抱歉,如果重复的话。

我从另一个函数返回了一个大的coo_matrix(例如x),我需要在与行数相同的numpy数组a中匹配条件的行上进行切片,单列(具有二进制值)。

我正在使用scipy.sparse.hstack([x,a])来将两者连接起来,以进行类似的操作

x1 = x[x[:,-1] == 0]
x2 = x[x[:,-1] == 1]

但是失败,并出现以下错误。

TypeError: 'coo_matrix' object is not subscriptable 

x.toarray()解决方案由于MemoryError而无法使用。

有没有办法做到以上几点?最后,我需要将切片的矩阵作为coo_matrix

1 个答案:

答案 0 :(得分:0)

制作一个随机的csr格式矩阵:

In [795]: M = sparse.random(20,10,.2,'csr')

获取最后一列的密集一维数组。 (我不需要矩阵或矩阵中的2d数组):

In [805]: M1 = M[:,-1].A.ravel()

现在我可以将其用作行掩码:

In [808]: M[M1==0,:]
Out[808]: 
<16x10 sparse matrix of type '<class 'numpy.float64'>'
    with 30 stored elements in Compressed Sparse Row format>
In [809]: M[M1>0,:]
Out[809]: 
<4x10 sparse matrix of type '<class 'numpy.float64'>'
    with 10 stored elements in Compressed Sparse Row format>

尝试使用稀疏列进行遮罩不起作用:

M[M[:,-1]>0,:]
IndexError: Indexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.

csr矩阵的索引是通过矩阵乘法完成的。将索引转换为1和0的稀疏矩阵,通过相乘最终选择所需的行。稀疏求和也通过乘法完成。

使用lil格式进行行索引也很容易。

How to get views on sparse matrices?


重新阅读您的问题,建议将xa分开。由于a已经很密集,因此只需使用

M1 = a.ravel()    # if a is (n,1) array
M1 = a.A1         # if a is (n,1) np.matrix

制作1d ndarray,如上面的[805]所示。而且由于它具有二进制值,所以您只对0与1感兴趣

M1 = M1.astype(bool)

M[~M1,:]
M[M1,:]

两个子集。

同样,如果不清楚,我们将无法索引coo格式矩阵。它必须为csrlil格式。