5

QuaternionC API を使用して、C++ で記述したクラスであるtype のオブジェクトを含む numpy 配列を作成したいと考えています。私はすでにこれらの配列 (実際にはstd::vector) を持っており、コピーを作成するか、可能であれば同じメモリを使用したいと考えています。

これは基本的な型ではないので、型を使用する必要があり、そのような簡単なものPy_Objectは使用できません。PyArray_SimpleNew

PyArray_NewFromDescrまたはを使用したいと思うかもしれませんが、Quaternion クラスを記述するために必要なオブジェクトをPyArray_SimpleNewFromDescr作成する方法について、完全に完全に迷っています。PyArray_Descr

その descr オブジェクトを作成する方法について、誰かが私にいくつかの指針を与えることができますか? または、numpy 配列を構築する方法について、より良いアイデアを教えてください。

これは基本的に、気を散らすことなく、この質問のより一般的なバージョンです。

編集:

dastrobu のヒントと私の SWIG ラッパーを使用して、それを行う方法を見つけました。誰もが SWIG を使用しているわけではないことはわかっていますが、使用している人のために、他の質問に対する私の回答は、私がどのようにそれを解決したかを示しています。

4

1 に答える 1

3

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.

于 2013-10-23T08:56:31.223 に答える