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
作成できるようにすることができます。PyQuaternions
Quaternions
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
.