[Numpy-discussion] __array_interface__ / __array_struct__
Travis E. Oliphant
oliphant@enthought....
Tue Jan 22 16:20:56 CST 2008
Thomas Heller wrote:
> Travis E. Oliphant schrieb:
>
>> Thomas Heller wrote:
>>
>>> I am experimenting with implementing __array_interface__ and/or __array_struct__
>>> properties for ctypes instances, and have problems to create numpy arrays
>>> from them that share the memory. Probably I'm doing something wrong;
>>> what is the correct function in numpy to create these shared objects?
>>>
>>> I am using numpy.core.multiarray.array(ctypes-object), is that correct?
>>>
>>>
>> Yes, this should work, as the array function goes through several checks
>> including looking for the __array_struct__ and/or __array_interface__
>> attributes. If you can point me to the code, I can probably help.
>>
>>
>
> The pure-python code, using __array_interface__, is here:
>
> http://ctypes-stuff.googlecode.com/svn/trunk/numpy/
>
> Use a webbrowser to view or download it, or an svn client
> to checkout a copy. I use it like this:
>
> from ctypes_array mport as_ctypes, as_array
> c_array = (c_double * 3)()
> numpy_array = as_array(c_array)
>
> or
>
> numpy_array = zeros(32)
> c_array = as_array(numpy_array)
>
> In the former example the objects to bot share memory, in the
> latter example they do.
>
> I also have an extension in the works that uses __array_struct__,
> but this is not yet uploaded.
>
This is all very good. The only thing missing that causes the former to
not share memory is you are missing a copy=False argument to the
multi_array function.
Thus:
return multi_array(obj, copy=0)
is what you need to use.
Also, the address of the memory is also available as
arr.ctypes.data if arr is a NumPy array (but this is less general than
using the array interface for sure).
-Travis O.
More information about the Numpy-discussion
mailing list