27

我设计了一个简单的函数来返回一个数学函数,该函数可用于拟合实验数据。这些函数看起来很像以下内容:

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

由于值太大或太小。我无法自己解决这个问题。有什么方法可以重新定义我的函数,让它在没有警告的情况下通过?

4

3 回答 3

52

您可以使用内置的上下文管理器numpy.errstate 。这将允许您将错误处理设置在 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 代码编写单元测试时不得不这样做。

于 2013-02-11T22:46:58.820 回答
24

用于numpy.seterr控制 numpy 在这种情况下的作用:http: //docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

使用警告模块来控制如何显示或不显示警告: http: //docs.python.org/library/warnings.html

于 2012-05-09T15:52:13.423 回答
5

要解决这个问题,您可以通过修改调用函数的数组元素的类型来提高精度。

例如,如果将数组a与作为元素的大数字乘以大浮点数会引发异常

RuntimeWarning: overflow encountered in multiply

然后在指定以下

a = np.array(a, dtype=np.float128)

不会出现警告。

于 2015-09-11T10:59:47.697 回答