2016-10-03 1 views
0

파이썬 C- 확장을 라이브러리에 쓰고 있으며 Numpy 배열로 데이터를 반환하려고합니다. 라이브러리에는 센서에서 C 구조로 데이터를 반환하는 함수가 있습니다. 그 구조에서 데이터를 가져 와서 Numpy 배열로 반환하고 싶습니다.Numpy Array를 사용하여 구조체의 데이터를 반환하십시오.

라이브러리의 구조 정의 :

typedef struct rs_extrinsics 
{ 
    float rotation[9]; /* column-major 3x3 rotation matrix */ 
    float translation[3]; /* 3 element translation vector, in meters */ 
} rs_extrinsics; 

함수 프로토 타입 :

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); 
} 
: 여기
void rs_get_device_extrinsics(const rs_device * device, rs_stream from_stream, rs_stream to_stream, rs_extrinsics * extrin, rs_error ** error); 

그냥 지금 첫 번째 값을 반환하려고 내 코드입니다

컴파일시 다음 오류가 발생합니다.

error: assigning to 'PyArrayObject' (aka 'struct tagPyArrayObject_fields') from incompatible type 'float' 
result[0] = extrin.rotation[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에서 목록 객체를 전달하고 PyList C API를 사용하여 float 시퀀스를 관리하는 것이 좋습니다.

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