2016-10-15 3 views
0

Une fonction que je vous appelle à partir d'une bibliothèque partagée retourne une structure appelée information semblable à ceci:Lancer un tableau de struct C à un tableau numpy

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

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

L'un des champs de la structure est un tableau de double tandis que l'autre est un tableau de nombres complexes. Comment puis-je convertir le tableau de nombres complexes en un tableau numpy? Pour les doubles, j'ai ce qui suit:

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

Existe-t-il une doublure pour les nombres complexes? Je peux le faire en utilisant des boucles.

Répondre

1

Définissez votre champ comme double et faire une vue complexe avec 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

La bibliothèque partagée exige que le champ soit un pointeur vers la structure CMPLX. –

+0

Ok, ça a marché. Pourriez-vous s'il vous plaît expliquer pourquoi? C exige que ce soit un pointeur vers la structure cmplx mais nous utilisons un pointeur vers un objet c_double dans python. –

+0

un nombre complexe n'est rien d'autre que deux doubles. Pour l'interface, le type n'est pas important (vous pouvez même utiliser des octets). À la fin, la vue de votre tableau numérique définit le type. – Daniel