在Cython中检查nan
我想找一种方法来检查Cython代码中的NaN值。目前,我使用的是:
if value != value:
# value is NaN
else:
# value is not NaN
有没有更好的方法呢?能不能像Numpy里的isnan
那样使用一个函数?
3 个回答
0
我试过用 x != x
和 math.h
里的 isnan
,发现这两种方法的速度差不多,而且都比 numpy
里的 np.isnan
快大约20倍。
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
27
摘自 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