Как мне найти значения в моем массиве numy, которые являются NaN / бесконечность / слишком большой для dtype ('float64')? - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь приспособить простую модель машинного обучения, используя scikit learn. По этой строке:

clf.fit(features, labels)

Я получаю знакомую ошибку:

 Input contains NaN, infinity or a value too large for dtype('float64').

Всякий раз, когда я сталкивался с этим раньше, когда это было, где значения NaN в моих данных. Я подтвердил, что в данных нет NaN. Два входа в метод .fit () (функции и метки) являются массивами np, но они создаются из фрейма данных pandas. Прямо перед извлечением значений NaN я напечатал:

print(features_df[features_df.isnull().any(axis=1)])
print(labels_df[labels_df.isnull().any(axis=1)])

Это напечатало пустые кадры данных, так что я знаю, что нет строки со значением NaN в нем. Я также проверил числовые массивы для значений NaN после преобразования и даже успешно суммировал их с помощью метода np sum (), поэтому в признаках или массивах np, переданных в соответствие, нет значений NaN.

Это означает, что должны быть значения бесконечности или действительно большие значения, в которые мне трудно поверить. Есть ли какой-нибудь способ, которым я могу напечатать любые значения в массиве данных или массиве np, которые:

are NaN, infinity or a value too large for dtype('float64')?

Мне нужно, чтобы они были специально указаны мне, так как я не могу найти их своими глазами, и нет значений NaN.

1 Ответ

0 голосов
/ 16 марта 2019

Предполагая, что это массив numpy, с формой (3,3):

ar = np.array([1, 2, 3, 4, np.nan, 5, np.nan, 6, np.inf]).reshape((3,3))
print (ar)
[[ 1.  2.  3.]
 [ 4. nan  5.]
 [nan  6. inf]]

Чтобы проверить NaN, бесконечность и отрицательную бесконечность, мы можем использовать:

numpy.isnan(ar)
numpy.isinf(ar)
numpy.isneginf(ar)

соответственно. Каждый из них возвращает массив bool, и передача массива bool в numpy.where() дает нам два массива индекса (один индексный массив на измерение ar):

ar_nan = np.where(np.isnan(ar))
print (ar_nan)

(массив ([1, 2], dtype = int64), массив ([1, 0], dtype = int64)) # Значения, nans при (1,1) и (2,0)

и

ar_inf = np.where(np.isinf(ar))
print (ar_inf)

(массив ([2], dtype = int64), массив ([2], dtype = int64)) # Значит, инф (2,2) * * тысяча двадцать-одна

Также, чтобы увидеть пределы float64:

np.finfo(np.float64)

finfo (разрешение = 1e-15, мин = -1,7976931348623157e + 308, max = 1,7796931348623157e + 308, dtype = float64)

...