Индексировать разреженную матрицу SciPy с помощью массива логических значений - PullRequest
10 голосов
/ 20 июня 2011

Массивы 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 Ответ

10 голосов
/ 20 июня 2011

Вы можете использовать np.nonzero (или ndarray.nonzero) в вашем логическом массиве, чтобы получить соответствующие числовые индексы, а затем использовать их для доступа к разреженной матрице.Поскольку «причудливое индексирование» для разреженных матриц весьма ограничено по сравнению с плотными ndarray s, вам необходимо распаковать кортеж строк, возвращаемый 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>
...