[PyKDE] Re: Using numpy/numarray in custom C++ code and
exposing with sip
Gerard Vermeulen
gvermeul at grenoble.cnrs.fr
Mon Feb 9 08:49:01 GMT 2004
Oops, I forgot: PyQwt exports also images to numpy/numarray arrays.
See sip/qwtqimage.sip and the files in the numpy directory in PyQwt.
On Fri, 6 Feb 2004 23:50:03 +0100
Gerard Vermeulen <gvermeul at grenoble.cnrs.fr> wrote:
> PyQwt only copies data from numpy/numarray arrays to C++, not the other way
> around. I explain what I would do (look at the code in CVS --
> http://cvs.sourceforge.net/viewcvs.py/pyqwt/pyqwt/ -- or get the snapshot from
> http://pyqwt.sourceforge.net/snapshot/PyQwt-20040118.tar.gz )
>
> You have to import the C-API's in the main sip file. In sip/qwtmod.sip this
> is done with:
>
> %PostInitialisationCode
> #ifdef HAS_NUMARRAY
> qwt_import_libnumarray();
> #endif
> #ifdef HAS_NUMERIC
> qwt_import_array();
> #endif
> %End
>
> The qwt_import_* functions are defined in separate files in the numpy directory
> for two reasons:
> 1. Name collisions in the header files that define the C-API of numpy and
> numarray (see below)
> 2. I do not like C++ code in sip files because it takes longer to rebuild
> after correct errors.
>
> The file sip/qwtcurve.sip shows how to copy data from a numpy array, numarray
> array or normal Python sequence of doubles to a QwtArray:
>
> void setData(SIP_PYOBJECT, SIP_PYOBJECT);
> %MethodCode
> QwtArray<double> xArray;
> if (-1 == try_PyObject_to_QwtArray(a0, xArray))
> return 0;
>
> QwtArray<double> yArray;
> if (-1 == try_PyObject_to_QwtArray(a1, yArray))
> return 0;
>
> Py_BEGIN_ALLOW_THREADS
> sipCpp->setData(xArray, yArray);
> Py_END_ALLOW_THREADS
> %End
>
> Again, try_PyObject_to_QwtArray delegates the C-API specific stuff to functions
> in separate files. Note that at least the numpy conversion function makes it
> unsafe to allow threading during the conversion (recent versions of numarray may
> be thread safe).
>
> I would try to write a getData() function like this:
>
> SIP_PYOBJECT getData()
> %MethodCode
> Create a numerical Python extension array and assign it to a pointer
> Copy the data into it
> Return the pointer to the array
> %End
>
> Maybe you have to replace SIP_PYOBJECT with void *.
> The Numeric or numarray docs show to implement the pseudo code.
>
> Gerard
>
> On Fri, 06 Feb 2004 11:19:15 -0800
> "Claus, Richard" <claus at SLAC.Stanford.EDU> wrote:
>
> > Hi Ulrich & Gerard,
> >
> > Your discussion about numpy/numarray usage by pyQwt piqued my interest. Could one of you please post a snippet of code showing how one exposes an array of, say, unsigneds, in custom C++ code as a numpy and/or numarray array in python via sip, or point me to where I can learn how to do this? I tried to discover how to do this once but gave up due to time constraints.
> >
> > Thanks very much.
> >
> > Ric
> >
> >
> > > -----Original Message-----
> > > From: Gerard Vermeulen [mailto:gvermeul at grenoble.cnrs.fr]
> > > Sent: Monday, February 02, 2004 12:00 AM
> > > To: ulrich.berning at t-online.de
> > > Cc: pykde at mats.imk.fraunhofer.de
> > > Subject: Re: [PyKDE] How to add handwritten *.cpp files to a
> > > sip generated module with configure.py
> > >
> > >
> > > On Mon, 02 Feb 2004 00:15:35 +0100
> > > ulrich.berning at t-online.de (Ulrich Berning) wrote:
> > >
> > > > Gerard Vermeulen schrieb:
> > > >
> > > > >Hi Phil,
> > > > >
> > > > >Ulrich Berning kindly provided me with code to build PyQwt with
> > > > >configure.py.
> > > > >
> > > > >One of his changes was to put a few handwritten *.cpp files to
> > > > >interface the Numerical Python extension modules (numpy
> > > and numarray)
> > > > >in the qwtmod.sip file.
> > > > >
> > > > >The problem is that there are conflicts between the header
> > > files of
> > > > >numpy and numarray (numarray should become the successor
> > > of numpy, so
> > > > >there is an overlap in their API). Putting all the
> > > interface code in
> > > > >the qwtmod.sip file leads to compile errors because of the
> > > inclusion
> > > > >of the conflicting headers in the same .cpp file.
> > > > >
> > > > >Ulli did not see it, because he is only having numpy, I guess.
> > > > >
> > > > >
> > > > >
> > > > Yes, this is true. I can't see why I should have numpy AND numarray.
> > > > Because numarry will be the successor of numpy someday, but
> > > currently it
> > > > is not, I choosed to stay with numpy. The only reason to
> > > support numpy
> > > > AND numeric could be to provide a binary module that works
> > > either with
> > > > numpy or with numarray or with none of them. But then, the
> > > interface
> > > > code needs some modifactions. You have to find out in the
> > > init function
> > > > if numpy or numarray or none of both is available. Simply calling
> > > > import_array() and/or import_libnumarray() does not work.
> > > If you call
> > > > import_libnumarray() when nummarray is not installed you get a
> > > > Py_FatalError().
> > > >
> > > > And at least, if I take a look at Numeric/arrayobject.h and
> > > > numarray/arrayobject.h, I can see the following:
> > > >
> > > > in Numeric/arrayobject.h:
> > > > #ifndef Py_ARRAYOBJECT_H
> > > > #define Py_ARRAYOBJECT_H
> > > >
> > > > in numarray/arrayobject.h:
> > > > #ifdef Py_ARRAYOBJECT_H
> > > > #error "Can't use numarray Numeric compatability *and*
> > > Numeric in same
> > > > module"
> > > > #endif
> > > >
> > > > My recommendation is, either numpy is used, if it is there
> > > OR numarray
> > > > if it is there OR none of them. Using the numpy API AND the
> > > numarray API
> > > > in the same module may work, but was not intended by the Numerical
> > > > Python Group and seems to be dangerous.
> > > >
> > > PyQwt is able to import both, since version 3.7 and since
> > > version 3.8 it includes numarray/libnumarray.h. It really
> > > works in the same Python program but it requires that calls
> > > to the Numeric API and numarray API are split into different
> > > source files (importing a C API from a C/C++ extension module
> > > is nothing else than setting up a table with pointers to
> > > functions into the module).
> > >
> > > I provide the possibility to use both so that people can make
> > > the transition. It also facilitates support and testing.
> > >
> > > The purpose of my mail was to point out a facility that is
> > > lacking from Phil's new build system (but I can hack my way
> > > out). It explains also why I am sticking so long with my own
> > > tools which are lacking in other respects.
> > >
> > > Gerard
> > >
> > > _______________________________________________
> > > PyKDE mailing list PyKDE at mats.imk.fraunhofer.de
> > > http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
> > >
> >
>
> _______________________________________________
> PyKDE mailing list PyKDE at mats.imk.fraunhofer.de
> http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
>
More information about the PyQt
mailing list