捕获numpy的runtimewarning作为例外,它们抑制

问题描述 投票:0回答:2

我知道这已经部分回答here

反正我不知道我实现我想要的。我会简单介绍一下我在做什么:

  • 通过一个巨大的具有特别嵌套结构JSON文件列表读取。
  • 提取他们的最低水平值,当这些值列出平均。
  • 收集这些值插入numpy的阵列。
  • 我倾倒数组numpy的腌成文件。

一切进展相当顺利,但我收到一些numpy的运行时警告:

  • RuntimeWarning: Mean of empty slice.
  • RuntimeWarning: invalid value encountered in double_scalars

功能这使我烦恼的是一个究竟是谁提取执行此操作的值:v = np.mean(v)

我知道这个错误可以通过零的列表,还是通过一些的NaN / INF或什么是入值造成的。

我想只是从我的数据集扔掉当前以.json样品摆脱他们。

所以,我给自己定:np.seterr(all='warn')

而我做了这个尴尬的代码,试图抓住它:

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"后已经停止,但我怎么能轻松地检查,如果我是正确的?

此外,有没有缩短该功能更Python的方式。我真的不喜欢嵌套在方式try/except

python json numpy exception warnings
2个回答
3
投票

这些警告模块确实是你所需要的:

import warnings
with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    np.mean([])

此代码将不会给出任何警告的运行时,我想你可以适应这个代码,你需要什么。如果不告诉我。


1
投票

由于于尔格·斯巴克梅林为他的评论,我发现了一个更好更简单的解决方案。这显然还好赶上我恢复到原始版本的功能外除外:

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

值得一提的任何人来这里了同样的异常。我成功搭上这两个警告,但print(e)会告诉你只有“意思是空片”。我能猜到为什么,但我太累了进一步调查。

© www.soinside.com 2019 - 2024. All rights reserved.