условная нарезка скудной разреженной матрицы - PullRequest
0 голосов
/ 07 сентября 2018

Извините, если это дубликат.

Я получил большой coo_matrix (скажем, x), возвращенный другой функцией, который мне нужно нарезать на строки, соответствующие условиям в массиве Numpy a с тем же числом строк и одним столбцом (с двоичным файлом ценности).

Я использую scipy.sparse.hstack ([x, a]) для их объединения, чтобы сделать что-то подобное

x1 = x[x[:,-1] == 0]
x2 = x[x[:,-1] == 1]

, но это не удается из-за следующей ошибки.

TypeError: 'coo_matrix' object is not subscriptable 

x.toarray() решение не работает из-за MemoryError.

Есть ли способ сделать вышеуказанное? Мне нужны нарезанные матрицы как coo_matrix в конце.

1 Ответ

0 голосов
/ 07 сентября 2018

Сделать случайную 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 формат.

...