Как мне найти значения в моем массиве numpy, которые равны NaN / бесконечности / слишком велики для dtype (‘float64’)?

#python #pandas #numpy #nan #numpy-dtype

#python #pandas #numpy #nan #numpy-dtype

Вопрос:

Я пытаюсь подогнать простую модель машинного обучения, используя 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. Я также проверил массивы numpy на наличие значений NaN после преобразования и даже успешно суммировал их с помощью метода np sum (), поэтому в np-массивах объектов или меток, переданных в fit, нет значений NaN.

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

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

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

Комментарии:

1. вы пытались отфильтровать значения с помощью чего-то вроде: df = df[df.column_name.notnull()] ? df = df[df.notnull()] вероятно, также должно сработать. df это фрейм данных pandas

2. Я не знаю о значениях, слишком больших для float64 (как вы вообще ввели их в свой массив?), Но /-inf, nan, вы можете найти, используя ~np.isfinite , начальная тильда инвертирует маску. Если вам нужны индексы вместо маски, используйте np.where для маски

Ответ №1:

Предполагая, что это массив 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)     # True wherever nan
numpy.isposinf(ar)  # True wherever pos-inf
numpy.isneginf(ar)  # True wherever neg-inf
numpy.isinf(ar)     # True wherever pos-inf or neg-inf
~numpy.isfinite(ar) # True wherever pos-inf or neg-inf or nan
  

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

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

(array ([1, 2], dtype=int64), array ([1, 0], dtype = int64)) # Означает, nans
в (1,1) и (2,0)

и

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

(array ([2], dtype=int64), array([2], dtype = int64)) # Означает, что inf находится в
(2,2)

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

 np.finfo(np.float64)
  

finfo (разрешение = 1e-15, min =-1.7976931348623157 e 308,
max = 1.7976931348623157 e 308, dtype = float64)