我正在寻找一种在Cython代码中检查NaN值的方法。目前,我正在使用:
if value != value:
# value is NaN
else:
# value is not NaN
有更好的方法吗?是否可以使用像Numpy的isnan
?
答案 0 :(得分:18)
取自http://groups.google.com/group/cython-users/msg/1315dd0606389416,你可以这样做:
cdef extern from "math.h":
bint isnan(double x)
然后你可以使用isnan(value)
。
在较新版本的Cython中,它更容易:
from libc.math cimport isnan
答案 1 :(得分:5)
如果您想确保您的代码也适用于Windows,则最好使用
cdef extern from "numpy/npy_math.h":
bint npy_isnan(double x)
因为在Windows上,据我所知,isnan被称为_isnan并在float.h中定义
另请参见此处:https://github.com/astropy/astropy/pull/186
如果您不想引入numpy,您还可以将这些预编译器指令插入到cython生成的.c文件中:
#if defined(WIN32) || defined(MS_WINDOWS)
#define USEMATH_DEFINES
#define isnan(x) _isnan(x)
#endif
答案 2 :(得分:0)
我尝试了x != x
的{{1}}和isnan
,发现性能几乎相同,并且两种方法的速度比{{1}中的math.h
快20倍}。