[Numpydiscussion] NumPy, buffers (PEP 3118), complex floats, and Cython
Dag Sverre Seljebotn
dagss@student.matnat.uio...
Sat Jul 5 08:44:58 CDT 2008
I'd like some advice for what way people feel would be the best for
supporting complex datatypes in NumPy in Cython; as well as ask in what
way it is likely that NumPy will make use of PEP 3118.
It seems like NumPy defines its complex data to be a struct of two
doubles, for instance:
typedef struct { double real, imag; } npy_cdouble;
According to PEP 3118 [1], it would be natural to export this as "dd"
(record of two doubles) rather than "Zd" (complex double), when
exporting ndarrays through a buffer interface. Right?
I'm implementing native Cython support/syntax candy for PEP 3118 [2] and
at the same time a backwardscompatability wrapper so that Cython can
access NumPy through PEP 3118 for Python <= 2.5 (essentially I implement
PyObject_GetBuffer etc. on behalf of NumPy for Python <= 2.5). Then the
question arise about how to deal with complex datatypes.
For Cython, it seems most userfriendly to use the C99 standard for
complex numbers (not currently supported, but it wouldn't be much work)
and have code like this:
cdef ndarray[complex double, 2] arr = ...
cdef complex double item
item = arr[34, 23]
So the natural questions then are:
 Is it ok to assume that (complex double*) can be safely casted to
(npy_cdouble*) on all platforms which both a) NumPy compiles and runs
on, and b) supports complex double? (It seems to be ok with GCC but I
wouldn't know about other compilers.)
 Will NumPy ever be rewritten to use the C99 complex datatype if
available? (I.e. #ifdef how npy_cdouble is defined, and define
corresponding #ifdefed macros for all complex operations). This would
remove the need for such a cast.
 Does NumPy plan to support PEP3118, and if so, will complex numbers be
exported as "dd" or "Zd"?

[1]: http://www.python.org/dev/peps/pep3118/
[2]: http://wiki.cython.org/enhancements/buffer

Dag Sverre
More information about the Numpydiscussion
mailing list