[Numpy-discussion] blitz++ and numarray
Fernando Perez
Fernando.Perez at colorado.edu
Mon Mar 29 12:26:48 EST 2004
Faheem Mitha wrote:
> Hi,
>
> I'm considering the use of the Blitz++ C++ library
> (http://www.oonumerics.org/blitz/) along with numarray/Numeric. I want
> to pass an array down to C++ and then manipulate it using Blitz++.
[snip]
> Also, weave.blitz() from SciPy looks relevant/useful, but this
> automatically generates its own C++ code, and I'd prefer to write my
> own.
The following should be enough to get you started:
#include "Python.h"
#include "Numeric/arrayobject.h"
#include "blitz/array.h"
using namespace std;
using namespace blitz;
// Convert a Numpy array to a blitz one, using the original's data (no copy)
template<class T, int N>
static Array<T,N> py_to_blitz(PyArrayObject* arr_obj)
{
int T_size = sizeof(T);
TinyVector<int,N> shape(0);
TinyVector<int,N> strides(0);
int *arr_dimensions = arr_obj->dimensions;
int *arr_strides = arr_obj->strides;
for (int i=0;i<N;++i) {
shape[i] = arr_dimensions[i];
strides[i] = arr_strides[i]/T_size;
}
return Array<T,N>((T*) arr_obj->data,shape,strides,neverDeleteData);
}
This is what I use for exactly the problem you are describing, and this code
was pretty much lifted, with minor changes, from weave's auto-generated C++.
What I do, to sidestep the memory management problems, is let python allocate
all my Numeric arrays (using zeros() if I have no data). I then use those
inside my C++ code as blitz++ arrays via the above snippet. Any changes made
by the C++ code are automatically reflected in the Numeric arary, since the
blitz object is using the Numeric data area.
I hope this helps. Let me know if you need more help, I can mail you complete
example code.
Cheers,
f
More information about the NumPy-Discussion
mailing list