Quaternionは直接数値型ではないため、配列にはasnumpy.objectが必要dtypeです。したがって、 を使用PyArray_SimpleNew(..., NPY_OBJECT)して配列を作成し、データを入力できます。問題は、Quaternionクラスが python 型ではないことです。そのため、型のオブジェクトへの参照で配列を埋めるQuaternionことはできません。(この場合、Python からクォータニオンで満たされた配列から要素を抽出すると、何が起こると予想されますか?) 代わりに、Quaternionクラスを のようなものでラップする必要がありますPyQuaternion。ラッパーは、参照カウントとメモリ管理を処理します。次のようになります。
typedef struct {
PyObject_HEAD
Quaternion *q;
}PyQuaternion;
static PyTypeObject PyQuaternion_Type = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"Quaternion", /*tp_name*/
sizeof(PyQuaternion), /*tp_basicsize*/
/* ... */
};
static PyObject *
PyQuaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds){
/* ... */
};
static int
PyQuaternion_init(PyQuaternion *self, PyObject *args, PyObject *kwds){
/* ... */
};
static void PyQuaternion_dealloc(PyQuaternion *self){
/* ... */
};
さらに、独自の C-API を定義して、からPyQuaternionType作成できるようにすることができます。PyQuaternionsQuaternions
static PyObject *
PyQuaternion_New(Quaternion *q){
PyQuaternion *self;
self = (PyQuaternion *)PyQuaternion_Type.tp_new(type, NULL, NULL);
self->q = q;
return (PyObject *)self;
}
self->q関数によって処理されることに注意してくださいPyQuaternion_dealloc。そのため、メモリ管理について考えてください。最も簡単な方法は、所有権をラッパーに渡して deallocate にすることPyQuaternion_deallocですself->q。
このPyQuaternion_New関数を使用すると、オブジェクトをラップQuaternionして、リスト、タプル、そしてもちろんdtype = numpy.object.