Поймай момент, когда я получаю NaN в своих вычислениях

Я запускаю циклы с линейной регрессией и выполняю вычисления там, где я часто получаю бесконечность. Когда я проверяю вывод переменной, я замечаю, что все происходит сбой, когда я начинаю получать "NaN". Я пробовал много разных способов работы с бесконечностями, но моя программа все равно вылетает. Я делал такие вещи, как замена NaN очень большими или очень маленькими значениями, но теперь я думаю, что все это бесполезно. Я не должен относиться ко всем NaN одинаково — по-видимому, некоторые NaN возникают при игре с положительными бесконечностями, а некоторые — с отрицательными бесконечностями.

Мне действительно нужно знать, в КАКОЙ точке мой код внезапно создает NaN, и была ли это отрицательная бесконечность, которая произвела его, или положительная. Как я могу это сделать, прежде чем программа вылетит?

Редактировать

Я знаю, как проверить наличие NaN. Я могу просто использовать numpy.isnan, и я использовал его. Но я хочу знать, когда это произойдет. Разве нет исключения или чего-то, что можно вызвать или выдать предупреждение, когда это произойдет?


person user961627    schedule 26.08.2014    source источник
comment
можете поделиться своим кодом. чтобы его можно было найти?   -  person sundar nataraj    schedule 26.08.2014
comment
Я делал такие вещи, как замена NaN очень большими или очень маленькими значениями, но теперь я думаю, что все это бесполезно В основном это бессмысленно. NaN — это, например, бесконечность/бесконечность . Слепо заменять это на «очень низкое» или «очень большое значение» просто неправильно.   -  person Sylvain Leroux    schedule 26.08.2014
comment
@SylvainLeroux да, именно это я понял, поэтому я хочу знать, в какой момент NaN и что его вызывает.   -  person user961627    schedule 26.08.2014
comment
Нет, это не дубликат, я знаю, как это проверить, все, что я делаю, это использую isnan, но я хочу проверить, когда это происходит, чтобы понять, почему.   -  person user961627    schedule 26.08.2014
comment
Чем конкретно вы занимаетесь? То, как вы должны обрабатывать исключительные случаи, обычно сильно зависит от конкретной проблемы, которую вы пытаетесь решить.   -  person tmyklebu    schedule 27.08.2014
comment
Просто пытаюсь отладить мой код и выяснить, где впервые появляются эти опасные NaN, которые являются причиной того, что мой код продолжает падать.   -  person user961627    schedule 27.08.2014


Ответы (1)


Если вы хотите перехватить числовое исключение с помощью numpy, лучше всего использовать numpy.seterr:

Например, чтобы вызвать исключение при недопустимой операции (что приводит к NaN):

import numpy as np

np.seterr(invalid='raise')
np.float64(0)/0.

Создание этого дисплея на консоли:

Traceback (most recent call last):
  File "h.py", line 4, in <module>
    np.float64(0)/0.
FloatingPointError: invalid value encountered in double_scalars
person Sylvain Leroux    schedule 26.08.2014
comment
Я понимаю. Итак, вы говорите, что я добавляю строку np.seterr над той, которая, как я подозреваю, может вызывать NaN? - person user961627; 26.08.2014
comment
К вашему сведению: соответствующий контекстный менеджер — np.errstate (docs.scipy.org /doc/numpy/reference/generated/). - person Warren Weckesser; 26.08.2014
comment
@WarrenWeckesser Я больше имел в виду глобальное изменение обработки исключений, поскольку ОП точно не знал, где находится проблема. Но для более узкого охвата np.errstate явно подходит. - person Sylvain Leroux; 26.08.2014