This question was asked on the Scipy mailing-list last year (well, one week ago). Nathan Bell proposed a skeleton that I used to create an out typemap for SWIG.
%typemap(out) std::vector<double> {
int length = $1.size();
$result = PyArray_FromDims(1, &length, NPY_DOUBLE);
memcpy(PyArray_DATA((PyArrayObject*)$result),&((*(&$1))[0]),sizeof(double)*length);
}
This typemap uses obviously Numpy, so don’t forget to initialize the module and to import it. Then there is a strange instruction in memcpy. &((*(&$1))[0]) takes the address of the array of the vector, but as it is wrapped by SWIG, one has to get to the std::vector by dereferencing the SWIG wrapper. Then one can get the first element in the vector and take the address.
Edit on May 2017: This is my most recent trials with this.
%typemap(out) std::vector<float> {
npy_intp length = $1.size();
$result = PyArray_SimpleNew(1, &length, NPY_FLOAT);
memcpy(PyArray_DATA((PyArrayObject*)$result),$1.data(),sizeof(float)*length);
}