Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 发生RuntimeWarning后暂停或停止numpy计算_Python_Numpy - Fatal编程技术网

Python 发生RuntimeWarning后暂停或停止numpy计算

Python 发生RuntimeWarning后暂停或停止numpy计算,python,numpy,Python,Numpy,我正在用计算机做一些计算。由于初始值不正确,其中一些计算会导致运行时警告 RuntimeWarning:根据测量,迭代没有取得良好的进展 通过最近十次迭代的改进。 warning.warn(msg,RuntimeWarning) 或 RuntimeWarning:根据测量,迭代没有取得良好的进展 通过最近五次雅可比评估的改进。 warning.warn(msg,RuntimeWarning) 由于我正在将所有初始值和所属结果写入一个文本文件(只是将stdout管道传输到一个文件),因此我想了解一

我正在用计算机做一些计算。由于初始值不正确,其中一些计算会导致运行时警告

RuntimeWarning:根据测量,迭代没有取得良好的进展 通过最近十次迭代的改进。
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传输到文件:-)一切都像一个符咒,所以我删除了我以前的评论,并勾选了你解决我问题的答案。