在Cython中使用Numpy的PyArray_IsScalar

时间:2017-09-02 15:45:35

标签: numpy cython

TLDR:如何在纯cython中定义下面的is_float_object函数?

我正在尝试了解pandas._libs.h中定义并通过pandas/_libs/src/numpy_helper.h公开的一些函数。 AFAICT我的困惑与is_float_object文件中对名称空间没有直觉有关。

numpy_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 from ...在哪里被定义,它是如何进入命名空间的,以及我需要使用什么类型的PyArray_IsScalar将它放入cython文件中。

#define PyArray_IsScalar(obj, cls) \ (PyObject_TypeCheck(obj, &Py##cls##ArrType_Type)) pandas/_libs/src/util.pxd中定义:

# Cannot be supported due to ## ## in macro:
# bint PyArray_IsScalar(object, verbatim work)

pandas / _libs / src / numpy.pxd中有一条评论让我觉得“##”意味着一些特殊的魔法在起作用:

Floating

numpy_helper.h在哪里定义?在不需要中间function detailsmodal(id) { var data = {"id":id}; jQuery.ajax({ url:<?php echo BASEURL;?>+'include/detailsmodal.php', method: "post", data: data, success: function(data){ jQuery('body').append(data); jQuery('#details-modal').modal('toggle'); }, error: function(){ alert("Error"); } }); } 文件的情况下直接在cython中定义此函数需要什么?

1 个答案:

答案 0 :(得分:2)

visible是C预处理程序连接。 ##不在任何名称空间中,而只是由C预处理程序在字符串连接中使用。部分Floating由C预处理器翻译为:

PyArray_IsScalar(obj, Floating)

如果你想在Cython中定义(PyObject_TypeCheck(obj, &PyFloatingArrType_Type)) ,你可以自己做这个连接:

is_float_object

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))); 有点猜测,但我认为它来自那里)