2016-10-15 3 views
0

функции Я звоню из разделяемой библиотеки возвращает структуру, называемой информацию, подобную этой:Кастинг массива структур C в Numpy массива

typedef struct cmplx { 
    double real; 
    double imag; 
} cmplx; 

typedef struct info{ 
    char *name; 
    int arr_len; 
    double *real_data 
    cmplx *cmplx_data; 
} info; 

Одно из полой структуры является массивом удваивается, а другой - массив комплексных чисел. Как преобразовать массив комплексных чисел в массив numpy? Для двойников у меня есть следующее:

from ctypes import * 
import numpy as np 

class cmplx(Structure): 
    _fields_ = [("real", c_double), 
       ("imag", c_double)] 


class info(Structure): 
    _fields_ = [("name", c_char_p), 
       ("arr_len", c_int), 
       ("real_data", POINTER(c_double)), 
       ("cmplx_data", POINTER(cmplx))] 

c_func.restype = info 
ret_val = c_func() 
data = np.ctypeslib.as_array(ret_val.contents.real_data, shape=(info.contents.arr_len,)) 

Есть ли один номер один для сложных номеров? Я могу сделать это с помощью петель.

ответ

1

Определите поле дважды и сделать сложный вид с NumPy:

class info(Structure): 
    _fields_ = [("name", c_char_p), 
       ("arr_len", c_int), 
       ("real_data", POINTER(c_double)), 
       ("cmplx_data", POINTER(c_double))] 

c_func.restype = info 
ret_val = c_func() 
data = np.ctypeslib.as_array(ret_val.contents.real_data, shape=(info.contents.arr_len,)) 
complex_data = np.ctypeslib.as_array(ret_val.contents.cmplx_data, shape=(info.contents.arr_len,2)).view('complex128') 
+0

разделяемые библиотеки требуют, чтобы поле было указателем на CMPLX структуру. –

+0

Хорошо, это действительно работаю. Не могли бы вы объяснить, почему? C требует, чтобы он был указателем на структуру cmplx, но мы используем указатель на объект c_double в python. –

+0

комплексное число - это не что иное, как два двухместных. Для интерфейса тип не важен (вы даже можете использовать байты). В конце, вид вашего numpy-массива определяет тип. – Daniel

Смежные вопросы