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

Posted

技术标签:

【中文标题】用布尔数组索引 SciPy 稀疏矩阵【英文标题】:Index a SciPy sparse matrix with an array of booleans 【发布时间】:2011-09-18 11:59:31 【问题描述】:

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 的行为?

【问题讨论】:

【参考方案1】:

您可以在布尔数组上使用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>

【讨论】:

如果您将索引中的rows.nonzero() 更改为rows.nonzero()[0]X,我会接受这个答案。即使没有scipy-user 上建议的:,它似乎也能工作。 索引也适用于元组,至少对于“普通”ndarrays。对于多维索引,不能使用nonzero()[0] 不适用于 SciPy 稀疏矩阵:IndexError: tuple index out of range. 好的,我玩了一些稀疏矩阵并更新了答案。似乎您确实需要: 切片,否则对于rows = (0, 2),您将不会获得子矩阵,而只会获得(0, 2) 处的单个元素。 还有numpy.flatnonzero(bools) 可以替代bools.nonzero()[0]。像 csr 这样设计用于行切片的稀疏矩阵是否有原因无法处理行的布尔索引?

以上是关于用布尔数组索引 SciPy 稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Scipy 稀疏矩阵作为 DataFrame 列

scipy稀疏矩阵的二维索引

如何将 numpy.matrix 或数组转换为 scipy 稀疏矩阵

哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

scipy构建稀疏矩阵