2016-12-19 3 views
0

J'utilise ctypes pour interopérer entre C et Python + numpy. Le code des deux côtés est écrit par moi. Habituellement, cela fonctionne comme prévu, mais j'ai rencontré un bug bizarre que je ne comprends pas.numpy et ctypes: traiter des vues

Ma question est: que se passe-t-il?

Je travaille sur Linux (Manjaro 16.10), avec gcc 6.2.1. python 2.7.12 et numpy 1.11.2.


Une version simplifiée de mon code C:

void imp(double *M) {/*do stuff, assumes M is a 3x3 row-major matrix*/} 

Une version simplifiée de mon code Python:

lib = ctypes.CDLL('path/to/lib.so') 

def function(M): 
    assert(M.dtype == np.float64) 
    lib.imp(M.ctypes.data_as(ctypes.POINTER(ctypes.c_double))) 

# Snippet 1: Doesn't work correctly, gives nonsense results. 
print my_var.dtype # prints 'float64' 
print my_var.shape # prints '(3, 3)' 
function(my_var) # the assert in function doesn't fail 

# Snippet 2: Works correctly, gives the expected results. 
my_var = my_var.astype(np.float64) # (!!) 
print my_var.dtype # The same... 
print my_var.shape # ...as in... 
function(my_var) # ...snippet 1 

MISE À JOUR

Remplacement

my_var = my_var.astype(np.float64) 

avec

my_var = my_var.copy() 

fonctionne tout aussi bien. Apparemment, la source du problème est le fait que my_var est une vue de numpy (j'ai vérifié cela en imprimant my_var.base). Donc, ma question révisée est la suivante: quelle est la bonne façon de passer des tableaux numpy avec ctype, si ces tableaux peuvent être des vues? Est-ce que copier tous les arguments avant d'appeler une fonction c est inévitable?

Répondre