Question Regarding numpy.i and 2-dimensional input array
Hello, I am trying to use numpy.i to move a function from python to C that takes a 2-D array as an input and am having difficulty. The code is pretty long so I've made a simple example that recreates the error. example.c: #include <stdio.h> #include "example.h" void matrix_example (int n, int m, double *x0, \ int p, double *x) { int i; int j; int k; for (i = 0; i < n; ++i) { for (j=0; j < 0; ++j) { x[k] = 2 * x0[i][j]; ++k; } } } example.h: void matrix_example (int n, int m, double *x0, int p, double *x); example.i: %module example %{ #define SWIG_FILE_WITH_INIT #include "example.h" %} %include "numpy.i" %init %{ import_array(); %} %apply (int DIM1, int DIM2, double *IN_ARRAY2) {(int n, int m, double *x0)}; %apply (int DIM1, double *ARGOUT_ARRAY1) {(int p, double *x)}; I then use prompts: $ swig -python example.i $ python setup.py build_ext --inplace However I get the error: example.c: In function ‘matrix_example’: example.c:12: error: subscripted value is neither array nor pointer error: command 'gcc' failed with exit status 1 It seems as though x0 is not actually being passed to the function as a 2-D array. Any help on why this error is happening would be great! Thank you, Dylan Temple -- Dylan Temple Graduate Student, University of Michigan NA&ME Department B.E. Naval Architecture M.S.E Naval Architecture 121 NA&ME Department, 2600 Draper Dr. 607-592-1749
Dylan, The error appears to be in example.c, not example_wrap.c. The way you have written it, I think it should be double **x0. But the SWIG typemaps require double*. You could write it with double *x0, but then index with x0[i*m+j]. Or, if you want the [i][j] indexing, you could write a wrapper function with double *x1 that calls your matrix_example() function with &x1. And then wrap the wrapper function. -Bill On Sep 4, 2012, at 5:18 PM, Dylan Temple wrote:
Hello,
I am trying to use numpy.i to move a function from python to C that takes a 2-D array as an input and am having difficulty. The code is pretty long so I've made a simple example that recreates the error.
example.c:
#include <stdio.h> #include "example.h"
void matrix_example (int n, int m, double *x0, \ int p, double *x) { int i; int j; int k; for (i = 0; i < n; ++i) { for (j=0; j < 0; ++j) { x[k] = 2 * x0[i][j]; ++k; } } }
example.h:
void matrix_example (int n, int m, double *x0, int p, double *x);
example.i:
%module example
%{ #define SWIG_FILE_WITH_INIT #include "example.h" %}
%include "numpy.i"
%init %{ import_array(); %}
%apply (int DIM1, int DIM2, double *IN_ARRAY2) {(int n, int m, double *x0)}; %apply (int DIM1, double *ARGOUT_ARRAY1) {(int p, double *x)};
I then use prompts:
$ swig -python example.i $ python setup.py build_ext --inplace
However I get the error: example.c: In function ‘matrix_example’: example.c:12: error: subscripted value is neither array nor pointer error: command 'gcc' failed with exit status 1
It seems as though x0 is not actually being passed to the function as a 2-D array. Any help on why this error is happening would be great!
Thank you, Dylan Temple
-- Dylan Temple Graduate Student, University of Michigan NA&ME Department B.E. Naval Architecture M.S.E Naval Architecture 121 NA&ME Department, 2600 Draper Dr. 607-592-1749
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
** 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 **
participants (2)
-
Bill Spotz -
Dylan Temple