如何用numpy在Cython中表示inf或-inf?

9 python optimization numpy cython scipy

我正在逐个元素地构建一个带有cython元素的数组.我想将常量np.inf(或-1 * np.inf)存储在某些条目中.但是,这需要回到Python查找的开销inf.有libc.math这个常数的等价物吗?或者其他一些可以轻松使用的值,可以在(-1*np.inf)没有开销的情况下从Cython中使用并且可以使用它们?

编辑示例,你有:

cdef double value = 0
for k in xrange(...):
  # use -inf here -- how to avoid referring to np.inf and calling back to python?
  value = -1 * np.inf
Run Code Online (Sandbox Code Playgroud)

Cai*_*von 15

它没有文字,但float可以从字符串中解析它:

>>> float('inf')
inf
>>> np.inf == float('inf')
True
Run Code Online (Sandbox Code Playgroud)

或者,math.h 可以(几乎肯定会)声明一个评估为inf的宏,在这种情况下你可以使用它:

cdef extern from "math.h":
    float INFINITY
Run Code Online (Sandbox Code Playgroud)

(没有干净的方法来检查INFINITY是否在纯Cython中定义,所以如果你想覆盖所有基础,你需要得到hacky.一种方法是创建一个小的C头,比如说fallbackinf.h:

#ifndef INFINITY
#define INFINITY 0
#endif
Run Code Online (Sandbox Code Playgroud)

然后在.pyx文件中:

cdef extern from "math.h":
    float INFINITY

cdef extern from "fallbackinf.h":
    pass

inf = INFINITY if INFINITY != 0 else float('inf')
Run Code Online (Sandbox Code Playgroud)

(你不能分配给INFINITY,因为它是一个右值.如果在标题中#defined INFINITY为1.0/0.0,你就可以取消三元运算符,但这可能会引发SIGFPE,具体取决于你的编译器.)

尽管如此,这绝对是货物崇拜优化的范畴.)


小智 14

在Cython中这样做的推荐方法是:

from numpy.math cimport INFINITY
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个"cimport"而不是常规导入.这是Cython围绕NumPy的官方包装npymath.

  • 我收到错误“致命错误:找不到numpy / npy_math.h”文件。有人知道吗? (2认同)
  • 你能为"推荐的方式......"提供引用吗? (2认同)