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

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

из-за слишком больших или малых значений. Однако я не могу понять эту проблему самостоятельно. Есть ли способ переопределить мою функцию, чтобы она прошла без предупреждений?

4b9b3361

Ответ 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)

никаких предупреждений не происходит.