很抱歉,如果重复的话。
我从另一个函数返回了一个大的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
。
答案 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?
重新阅读您的问题,建议将x
和a
分开。由于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
格式矩阵。它必须为csr
或lil
格式。