使用Numpy';在Cython中的s PyArray_IsScalar

使用Numpy';在Cython中的s PyArray_IsScalar,numpy,cython,Numpy,Cython,TLDR:我如何在纯cython中定义下面的is\u float\u object函数 我试图理解pandas.\u libs中的一些函数,它们在中定义并通过公开。AFAICT我的困惑与对.h文件中的名称空间没有直觉有关 以is\u float\u object为例。这在numpy\u helper.h中定义为 #include "Python.h" #include "numpy/arrayobject.h" #include "numpy/arrayscalars.h" [...] PAN

TLDR:我如何在纯cython中定义下面的
is\u float\u object
函数

我试图理解pandas.\u libs中的一些函数,它们在中定义并通过公开。AFAICT我的困惑与对
.h
文件中的名称空间没有直觉有关

is\u float\u object
为例。这在
numpy\u helper.h
中定义为

#include "Python.h"
#include "numpy/arrayobject.h"
#include "numpy/arrayscalars.h"
[...]

PANDAS_INLINE int is_float_object(PyObject* obj) {
    return (PyFloat_Check(obj) || PyArray_IsScalar(obj, Floating));
}
我不知道
Floating
是在哪里定义的,它是如何进入名称空间的,以及我需要使用什么类型的
cdef extern…
将它放入cython文件中

PyArray\u IsScalar
定义于:

pandas/_libs/src/numpy.pxd中有一条评论让我觉得“##”意味着某种特殊的魔力正在发挥作用:

# Cannot be supported due to ## ## in macro:
# bint PyArray_IsScalar(object, verbatim work)
浮动的
定义在哪里?如果不需要中间的
numpy\u helper.h
文件,直接在cython中定义此函数需要什么?

##
是一个C预处理器串联
Floating
不在任何名称空间中,只是由C预处理器在字符串连接中使用。部分
PyArray\u IsScalar(obj,Floating)
由C预处理器转换为:

(PyObject_TypeCheck(obj, &PyFloatingArrType_Type))
如果您想在Cython中定义
is\u float\u对象
,您可以自己进行连接:

from cpython cimport PyFloat_Check, PyObject_TypeCheck, PyTypeObject

cdef extern from "numpy/arrayobject.h":
   PyTypeObject PyFloatingArrType_Type

cdef int is_float_object(obj):
    return (PyFloat_Check(obj) or (PyObject_TypeCheck(obj, &PyFloatingArrType_Type)));
(来自“numpy/arrayobject.h”的
cdef外部代码有点像猜测,但我认为它来自那里)

是一个C预处理器串联
Floating
不在任何名称空间中,只是由C预处理器在字符串连接中使用。部分
PyArray\u IsScalar(obj,Floating)
由C预处理器转换为:

(PyObject_TypeCheck(obj, &PyFloatingArrType_Type))
如果您想在Cython中定义
is\u float\u对象
,您可以自己进行连接:

from cpython cimport PyFloat_Check, PyObject_TypeCheck, PyTypeObject

cdef extern from "numpy/arrayobject.h":
   PyTypeObject PyFloatingArrType_Type

cdef int is_float_object(obj):
    return (PyFloat_Check(obj) or (PyObject_TypeCheck(obj, &PyFloatingArrType_Type)));

(来自“numpy/arrayobject.h”
的cdef外部代码有点像猜测,但我认为它来自那里)

感谢您的关注。我还有更多的排列要尝试,但到目前为止,这会导致分段故障。在实际尝试调用该函数之前,它似乎不会检查PyFloatingArrType_类型是否存在。这似乎与我所期望的编译语言相反。我解释得不对吗?看起来ndarrayobject.h#包括uu multiarray_api.h,它用NPY_NO_导出标记PyFloatingArrType_类型。我猜这意味着我运气不好。我怀疑您需要先运行
numpy.import\u array()
PyFloatingArrType\u Type
很可能是一个全局变量,它仅由模块导入代码初始化。它在编译时存在,但在初始化之前没有有效的值。我不认为
NPY\u NO\u EXPORT
是一个大问题-使用它可能不是最佳做法,但考虑到pandas,您知道它工作吗np.import\u array()完成了这个技巧。你今天做了好事。谢谢你看这个。我还有更多的排列要尝试,但到目前为止,这会导致分段故障。在实际尝试调用该函数之前,它似乎不会检查PyFloatingArrType_类型是否存在。这似乎与我所期望的编译语言相反。我解释得不对吗?看起来ndarrayobject.h#包括uu multiarray_api.h,它用NPY_NO_导出标记PyFloatingArrType_类型。我猜这意味着我运气不好。我怀疑您需要先运行
numpy.import\u array()
PyFloatingArrType\u Type
很可能是一个全局变量,它仅由模块导入代码初始化。它在编译时存在,但在初始化之前没有有效的值。我不认为
NPY\u NO\u EXPORT
是一个大问题-使用它可能不是最佳做法,但考虑到pandas,您知道它工作吗np.import\u array()完成了这个技巧。你今天做了好事。