Подтвердить что ты не робот

Игнорировать деление на предупреждение 0 на python

У меня есть функция для статистических проблем:

import numpy as np
from scipy.special import gamma as Gamma

def Foo(xdata):
    ...
    return x1 * (
                 ( #R is a numpy vector
                  ( ((R - x2)/beta) ** (x3 -1) ) * 
                  ( np.exp( - ((R - x2) / x4) ) ) /
                  ( x4 * Gamma(x3))
                 ).real
                )

Иногда я получаю из оболочки следующее предупреждение:

RuntimeWarning: divide by zero encountered in...

Я использую функцию numpy isinf для исправления результатов функции в других файлах, где мне нужно делать. поэтому мне не нужно предупреждать.

Есть ли способ игнорировать сообщение? Другими словами, я не хочу, чтобы оболочка печатала это сообщение.

Я не хочу отключать все предупреждения python, только это.

4b9b3361

Ответ 1

Вы можете отключить предупреждение с помощью numpy.seterr. Поместите это до возможного деления на ноль:

np.seterr(divide='ignore')

Это приведет к отключению предупреждений о нулевом делении во всем мире. Если вы просто хотите немного их отключить, вы можете использовать numpy.errstate в предложении with:

with np.errstate(divide='ignore'):
    # some code here

Для нулевого деления на нуль (неопределенное, результат в NaN), поведение ошибки изменилось с numpy версии 1.12.0: теперь это считается "недопустимым", а ранее "разделить".

Таким образом, если есть вероятность, что ваш числитель может быть равен нулю, используйте

np.seterr(divide='ignore', invalid='ignore')

или

with np.errstate(divide='ignore', invalid='ignore'):
    # some code here

См. раздел "Совместимость" в примечания к выпуску, последний абзац перед разделом "Новые функции":

Сравнение чисел с плавающей запятой NaN теперь вызывает недопустимое предупреждение во время выполнения. Если ожидается NaN, предупреждение можно игнорировать с помощью np.errstate.

Ответ 2

Вы также можете использовать numpy.divide для деления. Таким образом, вам не нужно явно отключать предупреждения.

In [725]: np.divide(2, 0)
Out[725]: 0