2012-06-29 21 views
12

I construyó una matriz numpy ::cómo obtener la dirección de memoria de una matriz numpy para C

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

entonces quiero ver dónde están sus datos ::

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> 

...

¿por qué cada vez que la dirección de desplazamiento es diferente? si quiero transferir los datos a una función C utilizando c_types por ::

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

¿Cómo debo obtener el valor de ptr?

+0

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

Respuesta

15

También, eche un vistazo a ndarray.__array_interface__, que es un dict que contiene toda la información que está buscando.

En su caso,

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

gracias, esto es lo que quiero :) – shelper

+0

Estamos encantados de que ayudaron! Sin embargo, puede que no sea la forma mejor o más efectiva de hacerlo. Como J.F.Sebastian mencionó, eche un vistazo a 'numpy.ctypeslib' (aunque si recuerdo correctamente, también usa' __array_interface__'). –

+1

@Joe El resultado de 'a .__ matriz_interfaz __ ['datos']' no es igual a la dirección en el eco de 'a.data', como sigue' >>> a = array ([(1,2)]) >>> a.data >>> hexagonal de impresión (un .__ array_interface __ [ 'datos'] [0]) 0x893ff38' – Samuel

3

a.data puede ser una propiedad cuya función getter crea un nuevo objeto de búfer (metadatos) en cada llamada.

Para obtener la dirección vea cómo se implementa numpy.ctypeslib.as_ctypes().

Cuestiones relacionadas