30

I constructed an numpy array::

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

then i want to see where its data are::

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> 

...

why every time the offset address is different? if i want to transfer the data to a c function using c_types by::

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

how should i get the value of ptr?

shelper
  • 10,053
  • 8
  • 41
  • 67

3 Answers3

37

Also, have a look at ndarray.__array_interface__, which is a dict that contains all of the information you're after.

In your case,

pointer, read_only_flag = a.__array_interface__['data']
Joe Kington
  • 275,208
  • 71
  • 604
  • 463
  • Glad it helped! It may not be the best or most effective way to do it, though. As J.F.Sebastian mentioned, have a look at `numpy.ctypeslib` (Though if I recall correctly, it uses the `__array_interface__`, as well.). – Joe Kington Jun 29 '12 at 18:22
  • 1
    @Joe The result of `a.__array_interface__['data']` is not equal to the address in the echo of `a.data`, like following `>>>a=array([(1,2)]) >>> a.data >>> print hex(a.__array_interface__['data'][0]) 0x893ff38` – Samuel Aug 28 '13 at 14:26
  • 1
    @Samuel - That's because `a.data` is a `buffer` object, rather than the the actual memory buffer itself. Notice that a new, different buffer object is created each time you call `a.data` (as J.F. Sebastian notes in his answer). Have a look at: http://docs.python.org/2/library/functions.html#buffer – Joe Kington Aug 28 '13 at 14:38
  • That's bad practice because, obviously, `__array_interface__` is a hidden and undocumented field which may be changed in future versions without any warning. But numpy arrays have `ctypes.get_data()` method which returns the address of the first element of the array. – Maksym Ganenko Sep 07 '22 at 18:30
3

a.data might be a property whose getter function creates a new buffer object (meta data) on each call.

To get the address see how numpy.ctypeslib.as_ctypes() is implemented.

jfs
  • 399,953
  • 195
  • 994
  • 1,670
1

NumPy currently has documented interface to get raw pointer address to an array like this:

a = np.asarray([2, 3])
address = a.ctypes.data
Maksym Ganenko
  • 1,288
  • 15
  • 11