Numeric and swig (or, how to wrap functions).
Hello all.
I'm trying to figure out a (simple) way to wrap extension functions
using Numeric and swig. I want to use swig because I find the method
described i ch. 12 of the user manual a bit too elaborate.
The problem I'm facing with swig is that I cannot figure out a way to
pass arrays to the functions expecting double pointers as input. Say,
for example, that I want to wrap daxpy:
1. I put the function call interface into a swig file:
void daxpy(int* n,double* a, double* x,int* incx, double* y, int* incy)
2. I want the function call visible to python to be something like:
x = Numeric.arange(0.0,10.0)
y = a[:]
a = 1.0
daxpy(a,x,y)
3. To achieve 2. I make a python function that does the
real call to daxpy:
def daxpy(a,x,y):
<Do consistency checking between x and y>
n = len(x)
d_x = GetDataPointer(x)
inc_x =
* Roy Dragseth [snip Numeric and swig questions about how to give a numpy array to a swigged c function]
Any hints is greatly appreciated.
I've done this a few times. What you need to do is help swig
understand that a numpy array is input and how to treat this as a C
array. With swig you can do this with a typemap. Here's an example:
we can create a swig interface file like
%module exPyC
%{
#include
import exPyC import Numeric a = Numeric.zeros(10,'d') a array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) exPyC.arrayArg(a,10) a array([ 0. , 0.00996671, 0.0394695 , 0.08733219, 0.15164665, 0.22984885, 0.31882112, 0.41501643, 0.51459976, 0.61360105])
You can also get rid of the length argument with a typemap(python,ignore), see the swig docs. For more info about the safety checks in the typemap check the numpy docs. Lykke til! :-) HTH, Roger
participants (2)
-
Roger Hansen
-
Roy Dragseth