В питоне как заменить nan в разреженном csr_matrix - PullRequest
1 голос
/ 09 июня 2019

Я установил матрицу спреза и фрейм данных. Результирующий csr_matrix содержит NAN.

Мой вопрос заключается в том, как обновить эти значения nan до 0.

X_train_1hc = sp.sparse.hstack([X_train_1hc, X_train_df.values]).tocsr()

Когда я передаю X_train_1hc в классификатор, я получаю сообщение об ошибке Вход содержит NaN или бесконечность или значение, слишком большое для dtype ('float')

1.Есть ли опция / функция / хак для замены значений nan в разреженной матрице. Это концептуальный вопрос, и поэтому данные не предоставляются.

1 Ответ

0 голосов
/ 09 июня 2019

Если немного расширить ответ Мартина, вот один из способов сделать это.Предположим, у вас есть csr_matrix с некоторыми NaN значениями:

>>> Asp.todense()
matrix([[0.37512508,        nan, 0.34919696, 0.10321203],
        [0.48744859, 0.07289436, 0.16881342, 0.57637166],
        [0.37742037, 0.01425494, 0.38536847, 0.23799655],
        [0.95520474, 0.97719059,        nan, 0.22877082]])

Поскольку csr_matrix хранит ненулевые значения в атрибуте data , вам нужно манипулировать этим массивом,Заменив все вхождения NaN и inf на 0 и некоторое большое число (фактически наибольшее представимое), вы можете сделать

>>> Asp.data = np.nan_to_num(Asp.data, copy=False)
>>> Asp.todense()
matrix([[0.37512508, 0.        , 0.34919696, 0.10321203],
        [0.48744859, 0.07289436, 0.16881342, 0.57637166],
        [0.37742037, 0.01425494, 0.38536847, 0.23799655],
        [0.95520474, 0.97719059, 0.        , 0.22877082]])

В качестве альтернативы, вы можете заменить только NaNвручную, как это:

>>> Asp.data[np.isnan(Asp.data)] = 0.0
>>> Asp.todense()
matrix([[0.37512508, 0.        , 0.34919696, 0.10321203],
        [0.48744859, 0.07289436, 0.16881342, 0.57637166],
        [0.37742037, 0.01425494, 0.38536847, 0.23799655],
        [0.95520474, 0.97719059, 0.        , 0.22877082]])
...