[Numpy-discussion] C++ class encapsulating ctypes-numpy array?
Joris De Ridder
Joris.DeRidder@ster.kuleuven...
Thu Mar 20 07:46:17 CDT 2008
Thanks Matthieu, for the interesting pointer.
My goal was to be able to use ctypes, though, to avoid having to do
manual memory management. Meanwhile, I was able to code something in C+
+ that may be useful (see attachment). It (should) work as follows.
1) On the Python side: convert a numpy array to a ctypes-structure,
and feed this to the C-function:
arg = c_ndarray(array)
mylib.myfunc(arg)
2) On the C++ side: receive the numpy array in a C-structure:
myfunc(numpyArray<double> array)
3) Again on the C++ side: convert the C-structure to an Ndarray class:
(e.g. for a 3D array)
Ndarray<double,3> a(array)
No data copying is involved in any conversion, of course. Step 2 is
required to keep ctypes happy. I can now use a[i][j][k] and the
conversion from [i][j][k] to i*strides[0] + j * strides[1] + k *
strides[2] is done at compile time using template metaprogramming. The
price to pay is that the number of dimensions of the Ndarray has to be
known at compile time (to instantiate the template), which is
reasonable I think, for the gain in convenience. My first tests seem
to be satisfying.
I would really appreciate if someone could have a look at it and tell
me if it can be done much better than what I cooked. If it turns out
that it may interest more people, I'll put it on the scipy wiki.
Cheers,
Joris
On 19 Mar 2008, at 16:22, Matthieu Brucher wrote:
> Hi,
>
> On my blog, I spoke about the class we used. It is not derived from
> a Numpy array, it is implemented in terms of a Numpy array (http://matt.eifelle.com/item/5
> )
>
> Matthieu
>
> 2008/3/19, Joris De Ridder <Joris.DeRidder@ster.kuleuven.be>:
> Hi,
>
> I'm passing (possibly non-contiguous) numpy arrays (data + shape +
> strides + ndim) with ctypes to my C++ function (with external "C" to
> make ctypes happy). Has anyone made a C++ class derived from a ctypes-
> numpy-array with an overloaded [] operator to allow easy indexing
> (e.g. x[0][2][5] for a 3D array) so that you don't have to worry about
> strides? I guess I'm not the first one thinking about this...
>
> Cheers,
> Joris
>
>
>
> Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
>
>
> --
> French PhD student
> Website : http://matthieu-brucher.developpez.com/
> Blogs : http://matt.eifelle.com and http://blog.developpez.com/?
> blog=92
> LinkedIn : http://www.linkedin.com/in/matthieubrucher
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://projects.scipy.org/pipermail/numpy-discussion/attachments/20080320/9e692729/attachment-0002.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ndarray.h
Type: application/octet-stream
Size: 3697 bytes
Desc: not available
Url : http://projects.scipy.org/pipermail/numpy-discussion/attachments/20080320/9e692729/attachment-0001.obj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://projects.scipy.org/pipermail/numpy-discussion/attachments/20080320/9e692729/attachment-0003.html
More information about the Numpy-discussion
mailing list