Python 如何阻止我捕获的np.vectorize打印错误
我最近从Python2迁移到Python3,遇到了一个我认为在Python2中没有发生的问题(但我不完全确定) 以下代码打印出警告(但不会停止运行): 即使我在处理函数中的错误,也很好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
如何停止打印/发生此警告?我创建了一个装饰程序来抑制函数上的警告。它使用与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)