Python 用布尔数组索引SciPy稀疏矩阵

Python 用布尔数组索引SciPy稀疏矩阵,python,indexing,numpy,scipy,sparse-matrix,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]]

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]])
但这似乎不可能与SciPy稀疏矩阵;索引被视为数字索引,因此
False
选择第0行,
True
选择第1行。如何获得类似NumPy的行为?

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

>>> 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>
>行。非零()
(数组([0,2]),)
>>>索引=行。非零()[0]
>>>指数
数组([0,2])
>>>稀疏[索引,:]

如果您将索引中的
行.nonzero()
更改为
行.nonzero()[0]
,我将接受此答案。即使没有上建议的
,它似乎也能工作。索引也适用于元组,至少适用于“正常”数组。对于多维索引,您不能使用
nonzero()[0]
。不能使用SciPy稀疏矩阵:
索引器:元组索引超出范围。
。好的,我使用了稀疏矩阵并更新了答案。似乎您确实需要
切片,否则,对于
行=(0,2)
,您将不会得到子矩阵,而只得到
(0,2)
处的单个元素。还有
numpy.flatnonzero(bools)
作为
bools.nonzero()[0]
的替代。像csr这样为行切片而设计的稀疏矩阵不能处理行的布尔索引,这有什么原因吗?