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

13 投票
1 回答
7114 浏览
提问于 2025-04-16 19:53

NumPy数组可以用一个布尔数组来选择对应为 True 的行,也就是说,如果你有一个布尔数组,里面有一些是“真”(True),一些是“假”(False),那么你可以用这个数组来挑选出你想要的行:

>>> 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 个回答

13

你可以使用 np.nonzero (或者 ndarray.nonzero)来处理你的布尔数组,这样可以得到对应的数字索引。然后,你可以用这些索引来访问稀疏矩阵。因为在稀疏矩阵上进行“花式索引”的功能相比于普通的 ndarray 是比较有限的,所以你需要把 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>

撰写回答