[Numpy-discussion] SWIG and numpy.i

Bill Spotz wfspotz@sandia....
Wed Mar 25 08:03:16 CDT 2009


Kevin,

In this instance, the best thing is to write a wrapper function that  
calls your matSum() function,  and takes a double* rather than a  
double**.  You can %ignore the original function and %rename the  
wrapper so that the python interface gets the name you want.

On Mar 25, 2009, at 7:39 AM, Kevin Françoisse wrote:

> Thanks Bill, it helps me a lot ! My function works fine now.
>
> But I encounter an other problem. This time with a NumPy array of 2  
> dimensions.
>
> Here is the function I want to use :
>
> /****************/
> double matSum(double** mat, int n, int m){
>     int i,j;
>     double sum = 0.0;
>     for (i=0;i<n;i++){
>         for (j=0;j<m;j++){
>             sum += mat[i][j];
>         }
>     }
>     return sum;
> }
> /****************/
>
> I supposed that the typemaps to use is the following :
>
> %apply (double* IN_ARRAY2, int DIM1, int DIM2) {(double** mat, int  
> n, int m)};
>
> But it is not working. Of course, my typemaps assignement is not  
> compatible with my function parameters. I tried several ways of  
> using a two dimensional array but I'm not sure what is the best way  
> to do it ?
>
> Thanks
>
> ---
> Kevin Françoisse
> Ph.D. at Machine Learning Group at UCL
> Belgium
> kevin.francoisse@uclouvain.be
>
> On Tue, Mar 24, 2009 at 6:13 PM, Bill Spotz <wfspotz@sandia.gov>  
> wrote:
> Kevin,
>
> You need to declare vecSum() *after* you %include "numpy.i" and use  
> the %apply directive.  Based on what you have, I think you can just  
> get rid of the "extern double vecSum(...)".  I don't see what  
> purpose it serves.  As is, it is telling swig to wrap vecSum()  
> before you have set up your numpy typemaps.
>
>
> On Mar 24, 2009, at 10:33 AM, Kevin Françoisse wrote:
>
> Hi everyone,
>
> I have been using NumPy for a couple of month now, as part of my  
> research project at the university.  But now, I have to use a big C  
> library I wrote myself in a python project.  So I choose to use SWIG  
> for the interface between both my python script and my C library. To  
> make things more comprehensible, I wrote a small C methods that  
> illustrate my problem:
>
> /* matrix.c */
>
> #include <stdlib.h>
> #include <stdio.h>
> /* Compute the sum of a vector of reals */
> double vecSum(int* vec,int m){
>   int  i;
>   double sum =0.0;
>
>   for(i=0;i<m;i++){
>       sum += vec[i];
>   }
>   return sum;
> }
>
> /***/
>
> /* matrix.h */
>
> double vecSum(int* vec,int m);
>
> /***/
>
> /* matrix.i */
>
> %module matrix
> %{
> #define SWIG_FILE_WITH_INIT
> #include "matrix.h"
> %}
>
> extern double vecSum(int* vec, int m);
>
> %include "numpy.i"
>
> %init %{
> import_array();
> %}
>
> %apply (int* IN_ARRAY1, int DIM1) {(int* vec, int m)};
> %include "matrix.h"
>
> /***/
>
> I'm using a python script to compile my swig interface and my C  
> files (running Mac OS X 10.5)
>
> /* matrixSetup.py */
>
> from distutils.core import setup, Extension
> import numpy
>
> setup(name='matrix', version='1.0', ext_modules  
> =[Extension('_matrix', ['matrix.c','matrix.i'],
>    include_dirs = [numpy.get_include(),'.'])])
>
> /***/
>
> Everything seems to work fine ! But when I test my wrapped module in  
> python with an small NumPy array, here what I get :
>
> >>> import matrix
> >>> from numpy import *
> >>> a = arange(10)
> >>> matrix.vecSum(a,a.shape[0])
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: in method 'vecSum', argument 1 of type 'int *'
>
> How can I tell SWIG that my Integer NumPy array should represent a  
> int* array in C ?
>
> Thank you very much,
>
> Kevin
> <ATT00002.txt>
>
> ** Bill Spotz                                              **
> ** Sandia National Laboratories  Voice: (505)845-0170      **
> ** P.O. Box 5800                 Fax:   (505)284-0154      **
> ** Albuquerque, NM 87185-0370    Email: wfspotz@sandia.gov **
>
>
>
>
>
>
>

** Bill Spotz                                              **
** Sandia National Laboratories  Voice: (505)845-0170      **
** P.O. Box 5800                 Fax:   (505)284-0154      **
** Albuquerque, NM 87185-0370    Email: wfspotz@sandia.gov **








More information about the Numpy-discussion mailing list