跟踪numpy和scipy中的Python警告/错误到行号
我遇到了一个错误:
Warning: invalid value encountered in log
这个错误是从Python中出现的,我觉得是numpy(使用的是1.5.0版本)引发的。不过,因为我在好几个地方都调用了“log”函数,所以我不太确定这个错误是从哪里来的。有没有办法让numpy打印出导致这个错误的行号呢?
我猜这个警告是因为取了一个很小的数的对数,这个数小到可以被四舍五入成0或者更小(负数)。这样理解对吗?这些警告通常是从哪里来的呢?
2 个回答
0
如果你能访问到numpy的源代码,你可以找到打印那个警告的那一行(可以用grep等工具),然后修改相应的文件,让它在传入无效值时强制报错(比如使用断言)。这样做会给你一个堆栈跟踪,指向你代码中调用log时传入了不正确值的地方。
我简单查看了一下我的numpy源代码,没找到和你描述的警告相匹配的内容(不过我的numpy版本比你的旧)。
>>> import numpy
>>> numpy.log(0)
-inf
>>> numpy.__version__
'1.3.0'
你有没有可能在调用其他不是numpy里的log函数?比如,这里有一个在接收到无效输入时会抛出异常的函数。
>>> import math
>>> math.log(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
22
在你的代码中加入 np.seterr(invalid='raise')
(放在出问题的 log
调用之前),会让 numpy 在遇到错误时抛出一个异常,而不是只发出警告。这样你就能看到一个错误追踪信息,告诉你出错时 Python 正在执行哪一行代码。