由于Quaternion不是直接数字类型,因此您的数组必须具有numpy.objectas 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函数处理,因此请考虑内存管理。最简单的方法是将所有权传递给包装器并让PyQuaternion_deallocdeallocate self->q。
该PyQuaternion_New函数允许您包装Quaternion对象并将它们填充到任何 python 容器中,例如列表、元组,当然还有带有dtype = numpy.object.