Python 如何阻止我捕获的np.vectorize打印错误

Python 如何阻止我捕获的np.vectorize打印错误,python,numpy,warnings,Python,Numpy,Warnings,我最近从Python2迁移到Python3,遇到了一个我认为在Python2中没有发生的问题(但我不完全确定) 以下代码打印出警告(但不会停止运行): 即使我在处理函数中的错误,也很好 如何停止打印/发生此警告?我创建了一个装饰程序来抑制函数上的警告。它使用与Python文档相同的策略 import warnings def suppressWarnings(func): def wrapper(*args, **kwargs): with warnings.catch

我最近从Python2迁移到Python3,遇到了一个我认为在Python2中没有发生的问题(但我不完全确定)

以下代码打印出警告(但不会停止运行):

即使我在处理函数中的错误,也很好


如何停止打印/发生此警告?

我创建了一个装饰程序来抑制函数上的警告。它使用与Python文档相同的策略

import warnings

def suppressWarnings(func):
    def wrapper(*args, **kwargs):
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            func(*args, **kwargs)

    return wrapper
然后,您可以执行以下操作:

import numpy as np

@suppressWarnings
@np.vectorize
def reciprocal(num):
    try:
        return 1/num
    except ZeroDivisionError:
        return 0

reciprocal(0)

而且它不会打印任何警告。

当另一个解决方案中提供的
suppressWarning
装饰器工作时,它可能有点太允许了,因为它根本不报告警告。我认为,至少在某些情况下,最好是明确警告,将警告升级为错误,然后按错误处理。使用
警告
模块可以轻松完成此操作:

import numpy as np
import warnings

warnings.filterwarnings('error')

@np.vectorize
def reciprocal(num):
    try:
        return 1/num
    except ZeroDivisionError:
        # Now we end up here.
        return 0

reciprocal(0)

重要的区别在于,向量化函数会引发
RuntimeWarning
,这是除
之外的
无法捕捉到的。另外,您几乎肯定不应该为此使用
np.vectorize
,因为它效率很低。@juanpa.arrivillaga有什么更好的方法来实现函数的元素化?这类似于我为使用np.vectorize的神经网络编写的代码,速度越快越好。这取决于您正在尝试做什么,但是
np.vectorize
只是一个普通的Python for循环。但是您应该依靠
numpy
s的矢量化行为。因此,对于这个特定的函数,您应该只执行
rec=1/arr;rec[np.isinf(rec)]=0
使用此修饰符后,我的神经网络代码将不再工作。我没有时间弄清楚原因,但我只是想让其他人知道,这可能不应该被用作解决方案。不过,对于所给出的示例来说,它似乎确实有效。
import numpy as np
import warnings

warnings.filterwarnings('error')

@np.vectorize
def reciprocal(num):
    try:
        return 1/num
    except ZeroDivisionError:
        # Now we end up here.
        return 0

reciprocal(0)