2010-07-07 6 views
9

J'écris toujours sur une interface python pour mon code c avec des ctypes. Aujourd'hui, j'ai remplacé ma fonction de lecture de fichiers par une version python, qui a été programmée par quelqu'un d'autre sur NumPy. L'ancienne version de c était appelée avec un byref (p_data) alors que p_data = PFloat() (voir ci-dessous). La fonction principale prend le p_data.Comment utiliser la matrice NumPy avec des ctypes?

Old lecture du fichier:

p_data=POINTER(c_float) 
foo.read(filename,byref(p_data)) 
result=foo.pymain(p_data) 

La fonction de lecture de fichier python d'autre part retourne un tableau NumPy. Ma question est maintenant:

Comment convertir une matrice NumPy en POINTER (c_float)?

Je googlé mais seulement trouvé l'inverse: C arrays through ctypes accessed as NumPy arrays et des choses que je ne comprenais pas: C-Types Foreign Function Interface (numpy.ctypeslib)

[mise à jour] Correction d'une erreur dans le code exemple

Répondre

15

Votre code ressemble à ce a une certaine confusion - ctypes.POINTER() crée un nouveau pointeur ctypes class, pas une instance ctypes. De toute façon, le moyen le plus simple de passer un tableau NumPy au code ctypes est d'utiliser la méthode data_as de l'attribut ctypes de numpy.ndarray. Assurez-vous simplement que les données sous-jacentes sont le bon type en premier. Par exemple:

c_float_p = ctypes.POINTER(ctypes.c_float) 
data = numpy.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]]) 
data = data.astype(numpy.float32) 
data_p = data.ctypes.data_as(c_float_p) 
+0

Merci! C'était vraiment utile! –

Questions connexes