【问题标题】:Return data from struct using Numpy Array使用 Numpy 数组从结构返回数据
【发布时间】:2016-10-03 13:54:50
【问题描述】:

我正在为库编写 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];
          ^ ~~~~~~~~~~~~~~~~~~

【问题讨论】:

    标签: python c arrays numpy python-c-extension


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2019-05-06
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多