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_IsScalar
はnumpy/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でこの関数を直接定義するにはどうすればよいでしょうか?
これを見ていただきありがとうございます。私は試してみるためにいくつかの順列を持っていますが、これまではセグメンテーションにつながっています。 PyFloatingArrType_Typeが実際に関数を呼び出すまで存在するかどうかをチェックするのではないようです。コンパイル言語が期待しているとは反対のようです。私はそれを間違って解釈していますか? – user2957943
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
まず、numpy.import_array()を実行する必要があると思われます。 'PyFloatingArrType_Type'は、おそらくモジュールインポートコードによってのみ初期化されるグローバル変数です。コンパイル時に存在しますが、初期化されるまで有効な値はありません。 – DavidW