我正在为库编写Python C扩展,并希望将数据作为Numpy数组返回。该库具有将数据从传感器返回到C结构的功能。我想从该结构中获取数据并将其作为Numpy数组返回。
库中的结构定义:
typedef struct rs_extrinsics
{
float rotation[9]; /* column-major 3x3 rotation matrix */
float translation[3]; /* 3 element translation vector, in meters */
} rs_extrinsics;
函数原型:
void rs_get_device_extrinsics(const rs_device * device, rs_stream from_stream, rs_stream to_stream, rs_extrinsics * extrin, rs_error ** error);
这是我的代码,它只是试图立即返回第一个值:
static PyObject *get_device_extrinsics(PyObject *self, PyObject *args)
{
PyArrayObject *result;
int dimensions = 12;
rs_stream from_stream;
rs_stream to_stream;
rs_extrinsics extrin;
if (!PyArg_ParseTuple(args, "iiffffffffffff", &from_stream, &to_stream, &extrin)) {
return NULL;
}
result = (PyArrayObject *) PyArray_FromDims(1, &dimensions, PyArray_DOUBLE);
if (result == NULL) {
return NULL;
}
rs_get_device_extrinsics(dev, from_stream, to_stream, &extrin, &e);
check_error();
result[0] = extrin.rotation[0];
return PyArray_Return(result);
}
我在编译时遇到以下错误:
error: assigning to 'PyArrayObject' (aka 'struct tagPyArrayObject_fields') from incompatible type 'float'
result[0] = extrin.rotation[0];
^ ~~~~~~~~~~~~~~~~~~
答案 0 :(得分:0)
除数据外,PyArrayObject有多个字段:
typedef struct PyArrayObject {
PyObject_HEAD
char *data;
int nd;
npy_intp *dimensions;
npy_intp *strides;
PyObject *base;
PyArray_Descr *descr;
int flags;
PyObject *weakreflist;
} PyArrayObject;
您应该从PyArrayObjects获取数据字段数据。像这样:result->data[index];
您还需要将数据转换为result->descr->type
字符代码指示的正确类型。 dims,你传递给PyArray构造函数应该是npy_intp *
类型,而不是int。您的案例中的数组类型应为NPY_DOUBLE
。
如果从python调用函数(是吗?),最好只从Python传递list对象并使用PyList C API来管理float序列。
PyObject*list_of_floats;
PyArg_ParseTuple(args, "iiO", &from_stream, &to_stream, &list_of_floats);