使用Numpy';在Cython中的s PyArray_IsScalar
TLDR:我如何在纯cython中定义下面的使用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
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()完成了这个技巧。你今天做了好事。