我知道这已经部分回答here。
反正我不知道我实现我想要的。我会简单介绍一下我在做什么:
一切进展相当顺利,但我收到一些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
。
这些警告模块确实是你所需要的:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore")
np.mean([])
此代码将不会给出任何警告的运行时,我想你可以适应这个代码,你需要什么。如果不告诉我。
由于于尔格·斯巴克梅林为他的评论,我发现了一个更好更简单的解决方案。这显然还好赶上我恢复到原始版本的功能外除外:
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)
会告诉你只有“意思是空片”。我能猜到为什么,但我太累了进一步调查。