跟踪numpy和scipy中的Python警告/错误到行号

12 投票
2 回答
3358 浏览
提问于 2025-04-16 07:08

我遇到了一个错误:

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 正在执行哪一行代码。

撰写回答