[Numpy-discussion] Anyone have a well-tested SWIG-based C++ STL valarray <=> numpy.array typemap to share?
David Goldsmith
David.L.Goldsmith at noaa.gov
Fri Sep 7 21:23:26 EDT 2007
Thanks!
DG
Lisandro Dalcin wrote:
> David, I'll try to show you what I do for a custom C++ class, of
> course this does not solve the issue resizing (my class does not
> actually support resizing, so this is fine for me):
>
> My custom class is a templatized one called DTable (is like a 2d
> contiguous array), but currently I only instantiate it for 'int' and
> 'double'. This class have two relevant methods: getShape(), returning
> a std::pair, and getArray(), returning a reference to an underliing
> std::vector. So I am able to automatically support array interface by
> using this:
>
> First, I define a templatized utility function 'array_interface'
>
> %header %{
> namespace numpy {
>
> template<typename T> static char typechar() { return '\0'; }
> template<> static char typechar<int>() { return 'i'; }
> template<> static char typechar<double>() { return 'f'; }
>
> template<typename T>
> static PyObject*
> array_interface(const DTable<T>* self)
> {
> const std::pair<int,int>& shape = self->getShape();
> const std::vector<T>& data = self->getArray();
> void* array = const_cast<T*>(&data[0]);
> char endian = PyArray_NATIVE;
> char kind = typechar<T>();
> int elsize = sizeof(T);
> return Py_BuildValue("{sNsNsNsN}",
> "shape", Py_BuildValue("ii", shape.first, shape.second),
> "typestr", PyString_FromFormat("%c%c%d", endian, kind, elsize),
> "data", Py_BuildValue("NO", PyLong_FromVoidPtr(array), Py_False),
> "version", PyInt_FromLong(3));
> }
> }
> %}
>
> Now define a SWIG macro to apply it to instantiations of my class
>
> %define %array_interface(Class)
> %extend Class { PyObject* __array_interface__; }
> %{
> #define %mangle(Class) ##_## __array_interface__ ## _get(_t) \
> numpy::array_interface(_t)
> #define %mangle(Class) ##_## __array_interface__ ## _set(_t, _val) \
> SWIG_exception_fail(SWIG_AttributeError, "read-only attribute")
> %}
> %enddef
>
> and finally instantiate my class with different names for 'int' and
> 'double' in SWIG and finally apply previous macro
>
>
> %template(DTableI) DTable<int>;
> %template(DTableS) DTable<double>;
>
> %array_interface( DTable<int> );
> %array_interface( DTable<double> );
>
> I think you can implement someting similar for std::vector,
> std::valarray, or whatever... For use other data types, the only you
> need is to specialize the 'typecode' function.
>
> Hope this help you.
>
>
> On 9/4/07, David Goldsmith <David.L.Goldsmith at noaa.gov> wrote:
>
>> Anyone have a well-tested SWIG-based C++ STL valarray <=> numpy.array
>> typemap to share? Thanks!
>>
>> DG
>> --
>> ERD/ORR/NOS/NOAA <http://response.restoration.noaa.gov/emergencyresponse/>
>> _______________________________________________
>> Numpy-discussion mailing list
>> Numpy-discussion at scipy.org
>> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>>
>>
>
>
>
More information about the NumPy-Discussion
mailing list