2015-07-02 3 views
5

У меня есть разреженная матрица, которая преобразуется из sklearn tfidfVectorier. Я считаю, что некоторые строки - все-нулевые строки. Я хочу их удалить. Однако, насколько я знаю, существующие встроенные функции, например, nonzero() и elim_zero(), сосредоточиться на нулевых записях, а не на строках.scipy разреженная матрица: удалите строки, все элементы которых ноль

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

Пример: То, что я сейчас (на самом деле в разреженном формате):

[ [0, 0, 0] 
    [1, 0, 2] 
    [0, 0, 1] ] 

Что я хочу получить:

[ [1, 0, 2] 
    [0, 0, 1] ] 

ответ

2

Там не существующие функции для этого, но это не так слишком плохо, чтобы написать свой собственный:

def remove_zero_rows(M): 
    M = scipy.sparse.csr_matrix(M) 

Сначала преобразуйте матрицу в CSR (compressed sparse row) формат. Это важно, потому что матрицы CSR сохраняют свои данные в виде тройки (data, indices, indptr), где data содержит ненулевые значения, indices хранит индексы столбцов, а indptr содержит информацию индекса строки. Документах объяснить лучше:

индексы столбцов для строки я сохраняются в indices[indptr[i]:indptr[i+1]] и соответствующие им значения хранятся в data[indptr[i]:indptr[i+1]].

Итак, чтобы найти строки без ненулевых значений, мы можем просто посмотреть последовательные значения M.indptr. Продолжая нашу функцию сверху:

num_nonzeros = np.diff(M.indptr) 
    return M[num_nonzeros != 0] 

Второе преимущество формата CSR здесь является то, что это относительно дешево нарезать строк, что упрощает создание результирующей матрицы.

1

Спасибо за Ваш ответ, @perimosocordiae

Я просто найти другое решение самостоятельно. Я отправляю здесь, если кому-то это понадобится в будущем.

def remove_zero_rows(X) 
    # X is a scipy sparse matrix. We want to remove all zero rows from it 
    nonzero_row_indice, _ = X.nonzero() 
    unique_nonzero_indice = numpy.unique(nonzero_row_indice) 
    return X[unique_nonzero_indice] 
5

нарезка + getnnz() делает трюк:

M = M[M.getnnz(1)>0] 

работает непосредственно на csr_array. Вы также можете удалить все 0 столбцы без изменения форматов:

M = M[:,M.getnnz(0)>0] 

Однако, если вы хотите удалить, как вам нужно

M = M[M.getnnz(1)>0][:,M.getnnz(0)>0] #GOOD 

Я не знаю почему, но

M = M[M.getnnz(1)>0, M.getnnz(0)>0] #BAD 

не Работа.

Смежные вопросы