【发布时间】:2020-08-07 00:54:40
【问题描述】:
假设我有以下稀疏矩阵:
from scipy.sparse import coo_matrix
m = coo_matrix(([1,1,1,3,2], ([1,2,2,3,4],[1,1,2,3,3])))
print(m.toarray())
>>> array([[0, 0, 0, 0],
>>> [0, 1, 0, 0],
>>> [0, 1, 1, 0],
>>> [0, 0, 0, 3],
>>> [0, 0, 0, 2]])
我只想保留总和大于 1 的行。我认为以下方法可行。
csr = m.tocsr()
csr[(csr.sum(1) > 1)]
但它没有。相反,我必须对 numpy 数组进行转换(使用 squeeze):
csr = m.tocsr()
csr = csr[np.asarray(csr.sum(1) > 1).squeeze()]
csr.toarray()
所以,我得到了我想要的:
array([[0, 1, 1, 0],
[0, 0, 0, 3],
[0, 0, 0, 2]], dtype=int64)
有没有更直接的方法?
我知道有类似的答案,例如
在检查了this one之类的其他答案后,但在他们的情况下(使用M.getnnz(1)>0),该函数直接返回一个数组。
【问题讨论】:
-
你可以使用 ravel,但我不认为更直接。
-
@DaniMesejo,不一样吗?
csr[np.asarray(csr.sum(1) > 1).ravel()]而不是csr[np.asarray(csr.sum(1) > 1).squeeze()]。或者,你是什么意思?ravel()效率更高吗? -
这应该可以工作:
csr[np.ravel(csr.sum(1) > 1), :]
标签: python numpy scipy sparse-matrix