gpt4 book ai didi

python - 将 numpy runtimewarning 捕获为异常并抑制它们

转载 作者:太空宇宙 更新时间:2023-11-04 09:56:25 30 4
gpt4 key购买 nike

我知道这已得到部分回答 here .

无论如何,我不确定我是否实现了我想要的。我将简要说明我在做什么:

  • 通读大量的 json 文件嵌套结构。
  • 从中提取最低级别的值并在这些值是列表时取平均值。
  • 将这些值收集到 numpy 数组中。
  • 将我的 numpy 数组转储到腌制文件中。

一切都很顺利,但我收到一些 numpy 运行时警告:

  • RuntimeWarning:空切片的平均值。
  • RuntimeWarning:在 double_scalars 中遇到无效值

给我带来麻烦的函数是实际提取执行此操作的值的函数:v = np.mean(v)

我知道错误可能是由零列表或某些 NaN/Inf 或值中的任何内容引起的。

我想通过从我的数据集中丢弃当前的 .json 样本来摆脱它们。

所以我设置了:np.seterr(all='warn')

我编写了这个笨拙的代码来 try catch 它:

def ExtracValues(d):
for v in d.values():
if isinstance(v, dict):
yield from ExtracValues(v)
else:
if isinstance(v,list):
# v = np.mean(v) #just averaging vectorial values of features. #it may be here that raises the empty slice warning of numpy.
try:
v = np.mean(v)
except Warning:
return #trying to trash samples which are no behaving good
yield v

我的问题是我不知道它是否有效工作,因为警告仍然打印在标准输出上。我想代码应该在设置 all="Warning" 后停止,但我如何轻松检查我是否正确?

此外,是否有更 pythonic 的方法来缩短该函数。我真的不喜欢以这种方式嵌套的 try/except

最佳答案

感谢 Jürg Merlin Spaak 的评论,我找到了一个更好更简单的解决方案。在我恢复到原始版本的函数之外捕获异常显然更好:

def ExtractValues(d):
for v in d.values():
if isinstance(v, dict):
yield from ExtractValues(v)
else:
if isinstance(v,list):
v = np.mean(v)
yield v

我在代码的主要部分将所有内容都设置为警告:

np.seterr(all='warn')

然后捕获他们:

with warnings.catch_warnings():
warnings.filterwarnings('error')
try:
raw_features = list(ExtractValues(data))
except Warning as e:
print('Houston, we have a warning:', e)
print('The bad guy is: ' + current_file)
print('This sample will not be considered.')
pass
else:
#Whatever

值得注意的是,无论谁来这里都是为了同样的异常(exception)。我成功地捕获了这两个警告,但是 print(e) 只会告诉您“空切片的平均值”。我能猜到原因,但我太累了,无法进一步调查。

关于python - 将 numpy runtimewarning 捕获为异常并抑制它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45631716/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com