12

我正在逐个元素地构建一个带有 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
4

3 回答 3

17

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

>>> float('inf')
inf
>>> np.inf == float('inf')
True

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

cdef extern from "math.h":
    float INFINITY

(没有干净的方法来检查是否在纯 Cython 中定义了 INFINITY,因此,如果您想覆盖所有基础,则需要变得 hacky。一种方法是创建一个小的 C 标头,例如fallbackinf.h

#ifndef INFINITY
#define INFINITY 0
#endif

然后在您的 .pyx 文件中:

cdef extern from "math.h":
    float INFINITY

cdef extern from "fallbackinf.h":
    pass

inf = INFINITY if INFINITY != 0 else float('inf')

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

不过,这绝对属于货物崇拜优化领域。)

于 2013-04-17T02:49:09.383 回答
15

在 Cython 中执行此操作的推荐方法是:

from numpy.math cimport INFINITY

请注意,这是“cimport”而不是常规导入。这是 Cython 对 NumPy 的官方包装npymath

于 2014-12-08T18:07:31.110 回答
4

您可以使用 Numpy 的数学库,请参阅此处了解可用的内容

来自“numpy/npy_math.h”的 cdef extern:
    双信息“NPY_INFINITY”

在构建 Cython 扩展模块时,需要指定正确的包含目录和库来链接:

>>> 从 numpy.distutils.misc_util 导入 get_info
>>> get_info('npymath')
{'define_macros': [],
 '库':['npymath','m'],
 'library_dirs': ['/usr/lib/python2.7/dist-packages/numpy/core/lib'],
 'include_dirs': ['/usr/lib/python2.7/dist-packages/numpy/core/include']}

从该函数获得的信息可以传递到 Python distutils 或您使用的任何构建系统。

于 2013-04-17T20:32:07.810 回答