2017-09-02 7 views
0

TLDR:下記のis_float_object関数をpure cythonでどのように定義できますか?CythonでNumpyのPyArray_IsScalarを使用する

私はpandas._libsのいくつかの機能がで公開されているpandas/_libs/src/numpy_helper.hで定義されていることを理解しようとしています。 AFAICT私の混乱は、.hファイルの名前空間に直感を持たないことに関連しています。

is_float_objectを例にとります。これはFloatingが定義されている場所、私はそれが名前空間に入ったか、把握することはできません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)); 
} 

ように定義され、私はcythonファイルにそれを得るために使用する必要が cdef extern from ...の種類。

PyArray_IsScalarnumpy/ndarrayobject.hに定義されています。

#define PyArray_IsScalar(obj, cls)          \ 
    (PyObject_TypeCheck(obj, &Py##cls##ArrType_Type)) 

私は "##" は、いくつかの特別な魔法を意味思わせるパンダ/ _libs/SRC/numpy.pxd内のコメントはあり遊びである:

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

Floatingはどこですか?中間のnumpy_helper.hファイルを必要とせずにcythonでこの関数を直接定義するにはどうすればよいでしょうか?

答えて

2

##は、Cプリプロセッサ連結です。 Floatingはどの名前空間にもありませんが、Cプリプロセッサによる文字列の連結でのみ使用されます。あなたはこの連結を自分でやると思いますCythonでis_float_objectを定義したい場合は

(PyObject_TypeCheck(obj, &PyFloatingArrType_Type)) 

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))); 

cdef extern from "numpy/arrayobject.h"が少しある部分PyArray_IsScalar(obj, Floating)があることをCプリプロセッサで翻訳されています私はそれがそこから来ると思う)

+0

これを見ていただきありがとうございます。私は試してみるためにいくつかの順列を持っていますが、これまではセグメンテーションにつながっています。 PyFloatingArrType_Typeが実際に関数を呼び出すまで存在するかどうかをチェックするのではないようです。コンパイル言語が期待しているとは反対のようです。私はそれを間違って解釈していますか? – user2957943

+0

ndarrayobject.hのように見える#includes __multiarray_api.h、PyFloatingArrType_TypeをNPY_NO_EXPORTとラベル付けします。私はこれが私に運がないということを推測しています。 https://github.com/explosion/thinc/blob/master/include/numpy/__multiarray_api.h#L112 – user2957943

+0

まず、numpy.import_array()を実行する必要があると思われます。 'PyFloatingArrType_Type'は、おそらくモジュールインポートコードによってのみ初期化されるグローバル変数です。コンパイル時に存在しますが、初期化されるまで有効な値はありません。 – DavidW

関連する問題