Сделать случайную csr
матрицу формата:
In [795]: M = sparse.random(20,10,.2,'csr')
Получить плотный 1d массив последнего столбца. (Я не хочу матрицу или 2d массив из матрицы):
In [805]: M1 = M[:,-1].A.ravel()
Теперь я могу использовать это как маску строки:
In [808]: M[M1==0,:]
Out[808]:
<16x10 sparse matrix of type '<class 'numpy.float64'>'
with 30 stored elements in Compressed Sparse Row format>
In [809]: M[M1>0,:]
Out[809]:
<4x10 sparse matrix of type '<class 'numpy.float64'>'
with 10 stored elements in Compressed Sparse Row format>
Попытка маскирования с разреженным столбцом не работает:
M[M[:,-1]>0,:]
IndexError: Indexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.
Индексирование csr
матриц выполняется с умножением матриц. Индексы превращаются в разреженную матрицу из 1 и 0, которая с умножением заканчивается выбором нужных строк. Разреженное суммирование также выполняется с умножением.
Индексирование строк из lil
формата также просто.
Как получить представления о разреженных матрицах?
Перечитывая ваш вопрос, я бы рекомендовал разделить x
и a
. Поскольку a
уже плотный, просто используйте
M1 = a.ravel() # if a is (n,1) array
M1 = a.A1 # if a is (n,1) np.matrix
, чтобы сделать 1d ndarray
, как в [805] выше. И так как он имеет двоичные значения, и вы просто заинтересованы в 0 против 1
M1 = M1.astype(bool)
и
M[~M1,:]
M[M1,:]
для двух подмножеств.
Опять же, если неясно, мы не можем индексировать матрицу формата coo
. Это должен быть csr
или lil
формат.