索引带有布尔数组的SciPy稀疏矩阵

Fre*_*Foo 10 python indexing numpy scipy sparse-matrix

可以使用布尔数组索引NumPy数组,以选择与True条目对应的行:

>>> X = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> rows = np.array([True,False,True])
>>> X[rows]
array([[1, 2, 3],
       [7, 8, 9]])
>>> X[np.logical_not(rows)]
array([[4, 5, 6]])
Run Code Online (Sandbox Code Playgroud)

但是,对于SciPy稀疏矩阵来说,这似乎是不可能的; 索引被视为数字索引,因此False选择第0行并True选择第1行.如何获得类似NumPy的行为?

Fer*_*yer 10

您可以在布尔数组上使用np.nonzero(或ndarray.nonzero)来获取相应的数字索引,然后使用这些索引来访问稀疏矩阵.由于与密集ndarrays 相比,稀疏矩阵上的"花式索引"非常有限,因此需要解压缩返回的行元组,nonzero并指定要使用:切片检索所有列:

>>> rows.nonzero()
(array([0, 2]),)
>>> indices = rows.nonzero()[0]
>>> indices
array([0, 2])
>>> sparse[indices, :]
<2x100 sparse matrix of type '<type 'numpy.float64'>'
        with 6 stored elements in LInked List format>
Run Code Online (Sandbox Code Playgroud)

  • 还有`numpy.flatnonzero(bools)`作为`bools.nonzero()[0]`的替代品.是否有一个原因像csr那样设计用于行切片的稀疏矩阵无法处理行的布尔索引? (3认同)