Как преобразовать разреженную матрицу целочисленных значений в разреженную матрицу значений 0/1, Python

У меня есть разреженная матрица из векторизатора sklearn bag-of-words. Это csr_matrix, и его элементы представляют частоту слов в документе. Но теперь мне нужна матрица 0/1, где 1 представляет слово, существующее в документе, поэтому меня не волнует фактическая частота. Не обращайте внимания на проблему фона, это так: у меня разреженная матрица,

2 3 4 0 0 0
0 0 0 0 0 8
0 0 0 2 0 0
0 0 0 0 0 0

Я хочу, чтобы все ненулевые элементы были равны 1,

1 1 1 0 0 0
0 0 0 0 0 1
0 0 0 1 0 0
0 0 0 0 0 0

Как я могу этого добиться? Я предполагаю, что использование todense (), а затем loop - не лучший выбор, поскольку разреженная матрица велика. Есть ли способ лучше?


person Logan Yang    schedule 01.06.2013    source источник


Ответы (2)


Попробуйте csr_matrix. подписать. это должно быть именно то, что вам нужно (хотя сам не пробовал).

person Elazar    schedule 01.06.2013

Я думаю, вы могли бы просто создать новую матрицу из ненулевых индексов (см. scipy.sparse.csr_matrix). Предполагая, что ваша разреженная матрица называется sp_m:

sp_unit = csr_matrix( ([1]*len(sp_m.data), sp_m.nonzero()), shape=sp_m.shape )

ИЛИ

Как заметил другой пользователь, вы можете использовать функцию знака; однако я думаю, вам нужно будет возвести его в квадрат, если у вас есть отрицательные значения:

sp_unit = sp_m.sign.multiply(sp_m.sign)
person bcorso    schedule 01.06.2013
comment
Спасибо за развернутый ответ! .sign () похоже, решил мою проблему - person Logan Yang; 02.06.2013
comment
Просто имейте в виду, что если у вас есть отрицательные значения в вашей разреженной матрице, они будут преобразованы в -1 после использования .sign (). Если вам действительно нужны только 0 и 1 в общем случае, используйте .sign вместе с .multiply, как указано выше. - person bcorso; 02.06.2013