繁体   English   中英

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

[英]Return data from struct using Numpy Array

我正在将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];
          ^ ~~~~~~~~~~~~~~~~~~

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM