JSOBJ Object_npyEndObject(void *prv, JSOBJ obj) { PyObject *list; npy_intp labelidx; NpyArrContext* npyarr = (NpyArrContext*) obj; PRINTMARK(); if (!npyarr) { return NULL; } labelidx = npyarr->dec->curdim-1; list = npyarr->labels[labelidx]; if (list) { npyarr->labels[labelidx] = PyArray_FROM_O(list); Py_DECREF(list); } return (PyObject*) ((JSONObjectDecoder*)npyarr->dec)->endArray(prv, obj); }
JSOBJ Object_npyEndArrayList(void *prv, JSOBJ obj) { PyObject *list, *ret; NpyArrContext* npyarr = (NpyArrContext*) obj; PRINTMARK(); if (!npyarr) { return NULL; } // convert decoded list to numpy array list = (PyObject *) npyarr->ret; npyarr->ret = PyArray_FROM_O(list); ret = Npy_returnLabelled(npyarr); npyarr->ret = list; ((JSONObjectDecoder*)npyarr->dec)->newArray = Object_npyNewArray; ((JSONObjectDecoder*)npyarr->dec)->arrayAddItem = Object_npyArrayAddItem; ((JSONObjectDecoder*)npyarr->dec)->endArray = Object_npyEndArray; Npy_releaseContext(npyarr); return ret; }
PyObject *unary_af( PyObject *ary, F_SHORT f_short, F_INT f_int, F_LONG f_long, F_DOUBLE f_double ) { try { PyArrayObject *array = ( PyArrayObject * ) PyArray_FROM_O( ary ); switch( array->descr->type_num ) { case NPY_SHORT: case NPY_USHORT: return f_short( array ); case NPY_UINT: case NPY_INT: return f_int( array ); case NPY_LONG: case NPY_ULONG: return f_long( array ); case NPY_FLOAT: case NPY_DOUBLE: return f_double( array ); default: throw npp::PyException( PyExc_TypeError, "not a numeric array" ); } } catch( npp::PyException & ) { return NULL; } }
fffpy_multi_iterator* fffpy_multi_iterator_new(int narr, int axis, ...) { fffpy_multi_iterator* thisone; va_list va; fff_vector** vector; PyArrayMultiIterObject *multi; PyObject *current, *arr; int i, err=0; /* Create new instance */ thisone = (fffpy_multi_iterator*)malloc(sizeof(fffpy_multi_iterator)); multi = PyArray_malloc(sizeof(PyArrayMultiIterObject)); vector = (fff_vector**)malloc(narr*sizeof(fff_vector*)); /* Initialize the PyArrayMultiIterObject instance from the variadic arguments */ PyObject_Init((PyObject *)multi, &PyArrayMultiIter_Type); for (i=0; i<narr; i++) multi->iters[i] = NULL; multi->numiter = narr; multi->index = 0; va_start(va, axis); for (i=0; i<narr; i++) { current = va_arg(va, PyObject *); arr = PyArray_FROM_O(current); if (arr==NULL) { err=1; break; } else { multi->iters[i] = (PyArrayIterObject *)PyArray_IterAllButAxis(arr, &axis); Py_DECREF(arr); } } va_end(va); /* Test */ if (!err && _PyArray_BroadcastAllButAxis(multi, axis) < 0) err=1; if (err) { FFF_ERROR("Cannot create broadcast object", ENOMEM); free(thisone); free(vector); Py_DECREF(multi); return NULL; } /* Initialize the multi iterator */ PyArray_MultiIter_RESET(multi); /* Create the fff vectors (views or copies) */ for(i=0; i<narr; i++) vector[i] = _fff_vector_new_from_PyArrayIter((const PyArrayIterObject*)multi->iters[i], axis); /* Instantiate fiels */ thisone->narr = narr; thisone->axis = axis; thisone->vector = vector; thisone->multi = multi; thisone->index = thisone->multi->index; thisone->size = thisone->multi->size; return thisone; }