Python 发生RuntimeWarning后暂停或停止numpy计算
我正在用计算机做一些计算。由于初始值不正确,其中一些计算会导致运行时警告 RuntimeWarning:根据测量,迭代没有取得良好的进展 通过最近十次迭代的改进。Python 发生RuntimeWarning后暂停或停止numpy计算,python,numpy,Python,Numpy,我正在用计算机做一些计算。由于初始值不正确,其中一些计算会导致运行时警告 RuntimeWarning:根据测量,迭代没有取得良好的进展 通过最近十次迭代的改进。 warning.warn(msg,RuntimeWarning) 或 RuntimeWarning:根据测量,迭代没有取得良好的进展 通过最近五次雅可比评估的改进。 warning.warn(msg,RuntimeWarning) 由于我正在将所有初始值和所属结果写入一个文本文件(只是将stdout管道传输到一个文件),因此我想了解一
warning.warn(msg,RuntimeWarning) 或 RuntimeWarning:根据测量,迭代没有取得良好的进展 通过最近五次雅可比评估的改进。
warning.warn(msg,RuntimeWarning) 由于我正在将所有初始值和所属结果写入一个文本文件(只是将stdout管道传输到一个文件),因此我想了解一下,在计算大约500个步骤时,上面提到的运行时警告是在哪里发生的
如中所述,警告由处理,但在第一次运行时警告发生后是否有停止或暂停计算的方法?如果要在发出警告时终止计算,可以使用
警告
模块的功能强制将某些类型的警告作为异常发出。您可以通过以下方式完成此操作:
warnings.simplefilter('error')
这会将所有警告变成错误,并立即停止程序。缺点是不能通过简单地捕获异常来恢复计算:这是好事
如果您希望暂停程序,则可以使用一点“hack”来覆盖warnings
模块用于显示警告的功能。文档明确允许重写此函数,尽管我们目前的目的与文档中的目的不同。下面是一个简单的警告处理程序,询问用户是否继续。如果用户说“否”,则错误将升级为异常:
def handle_warning(message, category, filename, lineno, file=None, line=None):
print('A warning occurred:')
print(message)
print('Do you wish to continue?')
while True:
response = input('y/n: ').lower()
if response not in {'y', 'n'}:
print('Not understood.')
else:
break
if response == 'n':
raise category(message)
然后我们覆盖默认的警告处理程序:
warnings.showwarning = handle_warning
现在我们尝试优化平面函数:
from scipy.optimize import fsolve
fsolve(lambda x: 1, 1)
我们几乎立即得到一个信息:
A warning occurred:
The iteration is not making good progress, as measured by the
improvement from the last ten iterations.
Do you wish to continue?
y/n:
如果我们回答y
,将允许优化继续并返回其结果。如果我们回答n
,将引发异常并终止计算
上下文管理器解决方案
或者,如果您不想覆盖模块级的showwarning
功能,可以使用上下文管理器。我们可以将其放在一个函数中,该函数将所有内容都包装得既漂亮又整洁:
def pause_if_warning(function, *args, **kwargs):
with warnings.catch_warnings():
warnings.showwarning = handle_warning
return function(*args, **kwargs)
所以我们现在可以写:
pause_if_warning(fsolve, lambda x: 1, 1)
以获得与上述相同的行为。您使用什么输入来解决问题?我用一个常量函数的输入测试了上面的解决方案,它似乎有效。这只是我自己的错。-如果使用
input
进行用户交互,就不要将stdout传输到文件:-)一切都像一个符咒,所以我删除了我以前的评论,并勾选了你解决我问题的答案。