/* Convert an output array of any type, not necessarily contiguous */ static int NI_ObjectToOptionalOutputArray(PyObject *object, PyArrayObject **array) { if (object == Py_None) { *array = NULL; return 1; } else { *array = NA_OutputArray(object, tAny, NPY_ALIGNED|NPY_NOTSWAPPED); return *array ? 1 : 0; } }
/* Convert an output array of any type, not necessarily contiguous */ static int NI_ObjectToOutputArray(PyObject *object, PyArrayObject **array) { *array = NA_OutputArray(object, tAny, NPY_ALIGNED|NPY_NOTSWAPPED); return *array ? 1 : 0; }
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; i<narrays; i++) { PyObject *a = PySequence_GetItem(arrays, i); if (!a) return NULL; arr[i] = NA_InputArray(a, tFloat64, C_ARRAY); if (!arr[i]) return NULL; Py_DECREF(a); if (badmasks != Py_None) { a = PySequence_GetItem(badmasks, i); if (!a) return NULL; bmk[i] = NA_InputArray(a, tUInt8, C_ARRAY); if (!bmk[i]) return NULL; Py_DECREF(a); } } toutput = NA_OutputArray(output, tFloat64, C_ARRAY); if (!toutput) return NULL; for (i=0,f=0; i<ELEM(functions); i++) if (!strcmp(kind, functions[i].name)) { f = functions[i].fptr; break; } if (!f) return PyErr_Format( PyExc_ValueError, "Invalid comination function."); if (_combine( f, 0, arr[0]->nd, narrays, nlow, nhigh, arr, (badmasks != Py_None ? bmk : NULL), toutput) < 0) return NULL; for(i=0; i<narrays; i++) { Py_DECREF(arr[i]); if (badmasks != Py_None) { Py_DECREF(bmk[i]); } } Py_DECREF(toutput); Py_INCREF(Py_None); return Py_None; }