[Numpy-discussion] Advice on converting Numarray C extension?

Russell E. Owen rowen at u.washington.edu
Mon Jun 29 18:17:19 EDT 2009

In article 
<e06186140906291429m3cb339e8ge298f179d811e8a7 at mail.gmail.com>,
 Charles R Harris <charlesr.harris at gmail.com> wrote:

> On Mon, Jun 29, 2009 at 3:03 PM, Russell E. Owen 
> <rowen at u.washington.edu>wrote:
> > I have an old Numarray C extension (or, rather, a Python package
> > containing a C extension) that I would like to convert to numpy
> > (in a way that is likely to be supported long-term).
> >
> > Options I have found include:
> >
> > - Use the new numpy extension. This seems likely to be fast and
> > future-proof. But I am finding the documentation slow going. Does anyone
> > know of a simple example (e.g. read in an array, create a new array)?
> >
> > - Use the Numarray compatible C API. Simple (and takes advantage of the
> > nice Numarray tutorial example for documentation), but will this be
> > supported in the long term?
> >
> > - Switch to ctypes. Simple in concept. But I'm wondering if I can get
> > distutils to build the resulting package.
> >
> > - Use SWIG. I have some experience with it, but not with numpy arrays.
> >
> > - Use Cython to replace the C code. No idea if this is a long-term
> > supported package.
> >
> > Another option is to try to rewrite in pure python. Perhaps the numpy
> > indexing is sophisticated enough to allow an efficient solution. The C
> > extension computes a radial profile from a 2-d masked array:
> >  radProf(r)= sum of all unmasked pixels at radius r about some
> > specified center index
> > I can easily generate (and cache) a 2-d array of radius index, but is it
> > possible to use that to efficiently generate the desired sum?
> >
> > Any opinions?
> >
> How big is the extension and what does it do?

It basically contains 2 functions:
1: radProfile: given a masked image (2d array), a radius and a desired 
center: compute a new 1d array whose value at index r is the sum of all 
unmasked pixels at radius r.

2: radAsymm: given the same inputs as radProfile, return a (scalar) 
measure of radial asymmetry by computing the variance of unmasked pixels 
at each radius and combining the results.

The original source file is about 1000 lines long, of which 1/3 to 1/2 
is the basic C code and the rest is Python wrapper.

-- Russell

More information about the NumPy-Discussion mailing list