[Numpy-discussion] Options for wrapping C and C++ code for use with Numeric

Travis Oliphant oliphant at ee.byu.edu
Thu Nov 3 23:44:23 EST 2005


Stefan van der Walt wrote:

>Hi Chris
>
>On Thu, Nov 03, 2005 at 03:42:51PM -0800, Chris Barker wrote:
>  
>
>>Bruce Southey wrote:
>>    
>>
>>>Hi,
>>>I found SWIG extremely to use but it only exposes a function to Python but
>>>not to numpy. Thus it is very slow for matrix functions. So if you want
>>>speed then you will have to deal with the APIs.
>>>      
>>>
>>Yes, but can't I deal with them in writing typemaps, and then let SWIG 
>>do the rest of the work? I think I've seen some examples like this 
>>somewhere, but it's been a while and I need to go digging more.
>>    
>>
>
>I use SWIG and Blitz++ this way, and it works well.  I modified
>Fernando's typemap to work with templates.  See attached (does
>this need to be modified for Numeric3?).
>
>  
>
Only a little bit.  I'll mark the changes

>Stéfan
>  
>
>------------------------------------------------------------------------
>
>// -*- C++ -*-
>
>%{
>#include <blitz/array.h>
>#include <blitz/tinyvec.h>
>#include <Numeric/arrayobject.h>
>  
>
#include "scipy/arrayobject.h"

>%}
>
>namespace blitz {
>
>    template <class T, int N> class Array {
>
>	%typemap(in) Array<T,N> & (Array<T,N> M) {
>	    int T_size = sizeof(T);
>	    
>	    blitz::TinyVector<int,N> shape(0);
>	    blitz::TinyVector<int,N> strides(0);
>	    
>	    int *arr_dimensions = ((PyArrayObject*)$input)->dimensions;
>	    int *arr_strides = ((PyArrayObject*)$input)->strides;
>	    
>	    for (int i = 0; i < N; i++) {
>		shape[i]   = arr_dimensions[i];
>		strides[i] = arr_strides[i]/T_size;
>	    }
>	    
>	    M.reference(blitz::Array<T,N>((T*) ((PyArrayObject*)$input)->data,
>					  shape, strides, blitz::neverDeleteData));
>	    
>	    $1 = &M;
>	}
>
>    };
>}
>
>%template(matrix1d) blitz::Array<double, 1>;
>%template(matrix2d) blitz::Array<double, 2>;
>%template(matrix3d) blitz::Array<double, 3>;
>
>%template(matrix1f) blitz::Array<float, 1>;
>%template(matrix2f) blitz::Array<float, 2>;
>%template(matrix3f) blitz::Array<float, 3>;
>  
>
On 32-bit platforms, this code would work fine.

On 64-bit platforms, you would need to change at least the 
arr_dimensions and arr_strides arrays to be intp  (typedef to an integer 
the size of a pointer on the platform).

-Travis







More information about the NumPy-Discussion mailing list