#include "Python.h" #include #include #include #include #include "libnumarray.h" #define MAX_ARRAYS 1024 static PyObject *_Error; typedef Float64 (*combiner)(int, int, int, Float64 temp[MAX_ARRAYS]); static int _mask_and_sort(int ninputs, int index, Float64 **inputs, Bool **masks, Float64 temp[MAX_ARRAYS]) { int i, j, goodpix; if (masks) { for (i=j=0; idimensions[dim]; /* Allocate and convert 1 temporary row at a time */ for(i=0; idata; if (masks) { for(i=0; idata; } toutput = (Float64 *) output->data; for(j=0; jdimensions[dim]; i++) { for(j=0; jdata += inputs[j]->strides[dim]*i; if (masks) { masks[j]->data += masks[j]->strides[dim]*i; } } output->data += output->strides[dim]*i; _combine(f, dim+1, maxdim, ninputs, nlow, nhigh, inputs, masks, output); for(j=0; jdata -= inputs[j]->strides[dim]*i; if (masks) { masks[j]->data -= masks[j]->strides[dim]*i; } } output->data -= output->strides[dim]*i; } } return 0; } typedef struct { char *name; combiner fptr; } fmapping; static fmapping functions[] = { {"median", _inner_median}, {"average", _inner_average}, {"minimum", _inner_minimum}, }; static PyObject * _Py_combine(PyObject *obj, PyObject *args, PyObject *kw) { PyObject *arrays, *output; int nlow=0, nhigh=0, narrays; PyObject *badmasks=Py_None; char *keywds[] = { "arrays", "output", "nlow", "nhigh", "badmasks", "kind", NULL }; char *kind; combiner f; PyArrayObject *arr[MAX_ARRAYS], *bmk[MAX_ARRAYS], *toutput; int i; if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|iiOs:combine", keywds, &arrays, &output, &nlow, &nhigh, &badmasks, &kind)) return NULL; narrays = PySequence_Length(arrays); if (narrays < 0) return PyErr_Format( PyExc_TypeError, "combine: arrays is not a sequence"); if (narrays > MAX_ARRAYS) return PyErr_Format( PyExc_TypeError, "combine: too many arrays."); for(i=0; ind, narrays, nlow, nhigh, arr, (badmasks != Py_None ? bmk : NULL), toutput) < 0) return NULL; for(i=0; i