[SciPy-user] Need very simple example showing how to return numpy array from C/C++ function

Jeremy Conlin jeremit0 at gmail.com
Fri Dec 28 19:07:59 EST 2007


On Dec 28, 2007 5:50 PM, Matthieu Brucher <matthieu.brucher at gmail.com>
wrote:

> To make your .i work, you have two things to do :
> - first initialize numpy :
> %{
> #define SWIG_FILE_WITH_INIT
> %}
> %include "numpy.i"
> %init %{
> import_array();
> %}
>
> Then result (which is $1 in the typemap) is in fact a wrapper around the
> vector, and to get it, you have to dereference it, so the typemap becomes :
> %typemap(out) std::vector<double> {
>     int length = $1.size();
>     $result = PyArray_FromDims(1, &length, PyArray_DOUBLE);
>     memcpy(PyArray_DATA($result),&((*(&$1))[0]),sizeof(double)*length);
> }
>

YEAH!!! Now it works!  Thanks a lot!

Now that it works, I wonder how this could be done without copying the data.
 Since a STL vector can also be accessed and treated like an array, could we
exploit this to avoid copying?  I tried using the function
PyArray_FromDimsAndData and passing a reference to the first element using
the same syntax as for memcpy, but I got an error similar to the one I
previously reported:

error: no match for 'operator*' in '*result'



>
> I think I will add this one to my blog, if nobody minds.

I think it would be great to have a simple example like this available to
the community.  A page on the wiki would probably be best.  I could create
such a page, but with my limited experience, I'm not sure I would be the
best person.  I couldn't explain why all the elements in the *.i file are
necessary.

Thanks,
Jeremy


>
> Matthieu
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20071228/09d82efe/attachment.html>


More information about the SciPy-User mailing list