我设计了一个简单的函数来返回一个数学函数,该函数可用于将实验数据拟合到它.这些函数看起来非常像以下内容:
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))
Run Code Online (Sandbox Code Playgroud)
不幸的是,我遇到了RunTimeWarnings的麻烦:
RuntimeWarning: overflow encountered in power
RuntimeWarning: overflow encountered in divide
Run Code Online (Sandbox Code Playgroud)
由于值太大或太小.我无法自己解决这个问题.有没有办法重新定义我的功能,所以它会在没有警告的情况下通过?
Jay*_* P. 44
您可以使用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
Run Code Online (Sandbox Code Playgroud)
最近我在为一些遗留python代码编写单元测试时不得不这样做.
Mik*_*ham 18
使用numpy.seterr控制什么numpy的做在这种情况下:http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html
使用警告模块控制警告的显示方式:http://docs.python.org/library/warnings.html
小智 5
要解决这个问题,您可以通过修改调用函数的数组元素的类型来提高精度。
例如,如果将具有大数字作为元素的数组a乘以大浮点数会引发异常
RuntimeWarning: overflow encountered in multiply
Run Code Online (Sandbox Code Playgroud)
然后在指定以下内容时
a = np.array(a, dtype=np.float128)
Run Code Online (Sandbox Code Playgroud)
没有警告发生。