# [Numpy-discussion] Numpy+SWIG with arrays in input and output of a function

Antoine Delmotte antoinedelmotte@hotmail....
Fri Apr 16 08:58:29 CDT 2010

```Thank you very much for your help, Bill. It works perfectly now!

On 16/04/10 02:07, Bill Spotz wrote:
> Antoine,
>
> You want a python function with two python array arguments, therefore
> you are dealing with two different typemaps, each of which requires
> its own %apply directive:
>
> %apply (double* IN_ARRAY1    , int DIM1) {(double* vec , int m)};
> %apply (double* ARGOUT_ARRAY1, int DIM1) {(double* vec2, int n)};
>
> -Bill
>
> On Apr 15, 2010, at 7:33 PM, Antoine Delmotte wrote:
>
>
>> Dear Numpy and SWIG users,
>>
>> I am currently trying to use SWIG and Numpy to launch C++ codes from
>> python.
>>
>> My C++ code takes an array as an input (as well as integers, but
>> this will be my next problem...) and returns a different array (with
>> different dimensions).
>>
>> I have managed to make very simple codes taking an array in input OR
>> returning an array in output. However, I have not managed to develop
>> a code with an array in input and returning a different array in
>> output. Here is one of my attempts, which simply copies a vector (I
>> know I could use inplace for this example, but this is not what I
>> will need later since I want to return a different kind of array
>> than what I have as an input):
>>
>> /* matrix.c */
>>
>> #include<stdlib.h>
>> #include<stdio.h>
>> void vecOut(double* vec,int m,double* vec2,int n){
>>     int  i,j;
>>     double sum =0.0;
>>
>>     for(i=0;i<m;i++){
>>         vec2[i] = 2*vec[i];
>>     }
>>
>> }
>>
>>
>> /* matrix.h */
>>
>> void vecOut(double* vec,int m,double* vec2,int n);
>>
>>
>> /* matrix.i */
>>
>> %module matrix
>> %{
>> #define SWIG_FILE_WITH_INIT
>> #include "matrix.h"
>> %}
>>
>>
>> %include "numpy.i"
>>
>> %init %{
>> import_array();
>> %}
>>
>> %apply (double* IN_ARRAY1, int DIM1, int* ARGOUT_ARRAY1, int DIM1)
>> {(double* vec, int m, double* vec2, int n)};
>> %include "matrix.h"
>>
>>
>> /* 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(),'.'])])
>>
>>
>>
>> So, this is not working. The compilation is fine but when I try to
>> launch it, Python asks for 4 arguments. However, I would just like
>> to put one...
>>
>> matrix.vecOut([1,2,3])
>> Traceback (most recent call last):
>> TypeError: vecOut() takes exactly 4 arguments (1 given)
>>
>> I expected to get [1,2,3]...
>>
>>
>> Is it possible to do this with SWIG? Or should I use something else?
>>
>>
>> Best regards,
>>
>> Antoine
>> Hotmail : un service de messagerie gratuit, fiable et complet
>> Profitez-en<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 **
>
>
>
>
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
>

```