2012-06-29 5 views
12

ho costruito una matrice NumPy ::come ottenere l'indirizzo di memoria di un array di NumPy per C

a=np.ndarray([2,3]) 

poi voglio vedere dove i dati sono ::

a.data 
>>>Out[213]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E87A0> 
a.data 
>>>Out[214]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E82A0> 
a.data 
>>>Out[215]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E81C0> 

...

perché ogni volta che l'indirizzo di offset è diverso? se voglio trasferire i dati a una funzione c utilizzando c_types da ::

ctypes_array = (ctypes.c_char * a.size * 8).from_address(ptr) 

come dovrei ottenere il valore di ptr?

+0

correlato http://stackoverflow.com/a/3671889/ – jfs

risposta

15

Inoltre, dai un'occhiata a ndarray.__array_interface__, che è un codice che contiene tutte le informazioni che stai cercando.

Nel tuo caso,

pointer, read_only_flag = a.__array_interface__['data'] 
+0

grazie, questo è quello che voglio :) – shelper

+0

Glad ha aiutato! Tuttavia, potrebbe non essere il modo migliore o più efficace per farlo. Come menzionato da J.F.Sebastian, date un'occhiata a 'numpy.ctypeslib' (sebbene, se ricordo bene, usa anche il' __array_interface__'.). –

+1

@Joe Il risultato di 'a .__ array_interface __ ['data']' non è uguale all'indirizzo nell'eco di 'a.data', come segue' >>> a = array ([(1,2)]) >>> a.data >>> esagonale di stampa (un .__ array_interface __ [ 'dati'] [0]) 0x893ff38' – Samuel

3

a.data potrebbe essere una proprietà la cui funzione getter crea un nuovo oggetto buffer (metadati) su ogni chiamata.

Per ottenere l'indirizzo, vedere come è implementato numpy.ctypeslib.as_ctypes().