gpt4 book ai didi

python - 使用 Numpy 数组从结构返回数据

转载 作者:行者123 更新时间:2023-11-30 16:56:43 24 4
gpt4 key购买 nike

我正在向库编写 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;

函数原型(prototype):

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];
^ ~~~~~~~~~~~~~~~~~~

最佳答案

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 字符代码指示的正确类型。另外,您传递给 PyArray 构造函数的类型应该是 npy_intp * ,而不是 int 。您的情况下的数组类型应为 NPY_DOUBLE

如果您从 python 调用函数(是吗?),您最好只从 Python 传递列表对象并使用 PyList C API 来管理浮点序列。

PyObject*list_of_floats;
PyArg_ParseTuple(args, "iiO", &from_stream, &to_stream, &list_of_floats);

关于python - 使用 Numpy 数组从结构返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39833373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com