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

Charles R Harris charlesr.harris at gmail.com
Mon Jun 29 20:14:02 EDT 2009


On Mon, Jun 29, 2009 at 6:10 PM, Charles R Harris <charlesr.harris at gmail.com
> wrote:

>
>
> On Mon, Jun 29, 2009 at 4:17 PM, Russell E. Owen <rowen at u.washington.edu>wrote:
>
>> 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.
>>
>
> It sounds small enough that you should be able to update it to the numpy
> interface. What functions do you need? You should also be able to attach a
> copy (zipped) if it is small enough, which might help us help you.
>

And yes, you could probably do it in cython and save yourself a bit of
interface code. I think cython will currently handle 2d arrays without much
trouble. But I don't know what the fastest approach would be here.

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20090629/168111cd/attachment.html>


More information about the NumPy-Discussion mailing list