我有一段代码,大部分时间都能完美运行,但偶尔会在回溯中出现以下错误:
File "/path/to/somefile.py", line 272, in somefile
sm = -0.5 * (wv[0]**2. / sm2 + numpy.log(2. * numpy.pi * sm2))
TypeError: issubclass() arg 2 must be a class or tuple of classes
我知道
issubclass()
的作用并理解了错误,但我从未调用过它;代码中那一行纯属算术计算,所以我不知道为什么会首先引发这个TypeError
。我的唯一理论是Numpy在幕后调用它,但是跟踪回溯应该显示Numpy源代码中有问题的行,对吗?到底发生了什么?更新:
wv
是一个浮点数数组,而sm2
是一个浮点数标量。实际上,这个错误是由numpy.log
抛出的,也就是(新的)这一行。tmp = numpy.log(2. * numpy.pi * sm2)
没有更多的错误信息提供。
更多更新:
我的当前版本的Numpy(来自Python提示):
>>> import numpy
>>> numpy.__version__
'1.6.2'
我将问题行更改为:
try:
tmp = numpy.log(2. * numpy.pi * sm2)
except TypeError:
print type(sm2), 2. * numpy.pi * sm2
并获得了输出结果
<type 'numpy.float64'> 0.0
因此,出现某种错误是有道理的,但如果我在Python提示符下执行以下操作:
>>> import numpy
>>> numpy.log(0.)
我得到了我所期望的错误(并且已经通过warning
模块在相关代码中进行了处理):
__main__:1: RuntimeWarning: divide by zero encountered in log
-inf
numpy.log
)。 - JBernardosm2
的值为0。这就解释了为什么应该会出现某种错误,但我本来期望会有一个RuntimeWarning
(请参见我的上面更新),而我已经在处理它了。 - empricetype(sm2)
给出的结果是<type 'numpy.float64'>
。 - empricenp.log
中为0
给出了-inf
,并为负数给出了nan
,所以你可以直接使用它们? - sebergRuntimeWarning
的方法,所以我会尝试使用它。感谢您在解决这个问题上的所有帮助! - emprice