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?

1

3 Answers 3

39

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']
Sign up to request clarification or add additional context in comments.

4 Comments

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 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 <read-write buffer for 0x8b174c0, size 8, offset 0 at 0x8af6120> >>> print hex(a.__array_interface__['data'][0]) 0x893ff38
@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: docs.python.org/2/library/functions.html#buffer
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.
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.

Comments

3

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

a = np.asarray([2, 3])
address = a.ctypes.data

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.