Python: как избежать numpy RuntimeWarning в определении функции?
i спроектировал простую функцию для возврата математической функции, которая может использоваться для подгонки экспериментальных данных. Функции выглядят примерно так:
def colecole_2(f,*p):
term1=p[0] * ( 1 - 1 / (1 + numpy.power((0+1j) * 2 * numpy.pi * f * p[1], p[2])))
term2=p[3] * ( 1 - 1 / (1 + numpy.power((0+1j) * 2 * numpy.pi * f * p[4], p[5])))
return p[6]*(1-abs( term1+ term2))
К сожалению, я столкнулся с проблемами с RunTimeWarnings как:
RuntimeWarning: overflow encountered in power
RuntimeWarning: overflow encountered in divide
из-за слишком больших или малых значений. Однако я не могу понять эту проблему самостоятельно. Есть ли способ переопределить мою функцию, чтобы она прошла без предупреждений?
Ответы
Ответ 1
Используйте numpy.seterr
для управления тем, что делает numpy в этом случае: http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html
Используйте модуль предупреждений для управления тем, как предупреждения или не представлены: http://docs.python.org/library/warnings.html
Ответ 2
Вы можете использовать numpy.errstate, который является встроенным менеджером контекста. Это позволит вам установить передачу err в контексте инструкции with.
import numpy
# warning is not logged here. Perfect for clean unit test output
with numpy.errstate(divide='ignore'):
numpy.float64(1.0) / 0.0
Мне приходилось делать это недавно, когда записывали модульные тесты для некоторого унаследованного кода python.
Ответ 3
Чтобы обойти это, вы можете увеличить точность, изменив тип элементов массива, на которые вы вызываете свою функцию.
Например, если умножить массив a на большие числа в качестве элементов большим числом с плавающей запятой вызывает исключение
RuntimeWarning: overflow encountered in multiply
то после указания следующего
a = np.array(a, dtype=np.float128)
никаких предупреждений не происходит.