diff options
Diffstat (limited to 'scipy/base/src')
-rw-r--r-- | scipy/base/src/arrayobject.c | 59 | ||||
-rw-r--r-- | scipy/base/src/multiarraymodule.c | 11 | ||||
-rw-r--r-- | scipy/base/src/scalartypes.inc.src | 35 | ||||
-rw-r--r-- | scipy/base/src/ufuncobject.c | 13 |
4 files changed, 67 insertions, 51 deletions
diff --git a/scipy/base/src/arrayobject.c b/scipy/base/src/arrayobject.c index f8833c9e6..ac6814ac3 100644 --- a/scipy/base/src/arrayobject.c +++ b/scipy/base/src/arrayobject.c @@ -804,7 +804,7 @@ PyArray_Scalar(void *data, int type_num, int itemsize, int swap) else obj = type->tp_alloc(type, 0); if (obj == NULL) return NULL; - if PyTypeNum_ISFLEXIBLE(type_num) { + if PyTypeNum_ISEXTENDED(type_num) { if (type_num == PyArray_STRING) { destptr = PyString_AS_STRING(obj); ((PyStringObject *)obj)->ob_shash = -1; @@ -895,6 +895,7 @@ static int PyArray_RegisterDataType(PyTypeObject *type) { PyArray_Descr *descr; + PyObject *obj; int typenum; int i; @@ -915,7 +916,14 @@ PyArray_RegisterDataType(PyTypeObject *type) sizeof(PyArray_Descr)); typenum = PyArray_USERDEF + PyArray_NUMUSERTYPES; descr->type_num = typenum; - descr->typeobj = type; + descr->typeobj = type; + obj = PyObject_GetAttrString((PyObject *)type,"itemsize"); + if (obj) { + i = PyInt_AsLong(obj); + if ((i < 0) && (PyErr_Occurred())) PyErr_Clear(); + else descr->elsize = i; + } + Py_INCREF(type); userdescrs = realloc(userdescrs, (PyArray_NUMUSERTYPES+1)*sizeof(void *)); if (userdescrs == NULL) { @@ -2763,7 +2771,7 @@ array_repr_builtin(PyArrayObject *self) free(string); return NULL; } - if (PyArray_ISFLEXIBLE(self)) { + if (PyArray_ISEXTENDED(self)) { char buf[100]; snprintf(buf, sizeof(buf), "%d", self->itemsize); sprintf(string+n, ", '%c%s')", self->descr->type, buf); @@ -3242,23 +3250,18 @@ PyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num, } } else self->flags = (flags & ~UPDATEIFCOPY); - - if (PyTypeNum_ISFLEXIBLE(type_num)) { + + self->itemsize = descr->elsize; + if (self->itemsize == 0) { if (itemsize < 1) { PyErr_SetString(PyExc_ValueError, - "type must provide an itemsize"); + "data type must provide an itemsize"); self->ob_type->tp_free((PyObject *)self); return NULL; } self->itemsize = itemsize; - /* Guarantee that these kind of arrays are never byteswapped - unknowingly. - */ - if (type_num != PyArray_UNICODE) - self->flags |= NOTSWAPPED; } - else self->itemsize = descr->elsize; - + sd = self->itemsize; if (nd > 0) { @@ -3532,9 +3535,9 @@ PyArray_FillWithScalar(PyArrayObject *arr, PyObject *obj) static PyObject * array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"shape", "dtype", "buffer", "offset", + static char *kwlist[] = {"shape", "dtype", "itemlen", "buffer", "offset", "strides", "swap", "fortran", NULL}; - int itemsize = 0; + int itemsize = -1; PyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0}; int type_num = PyArray_NOTYPE; PyArray_Dims dims = {NULL, 0}; @@ -3554,11 +3557,12 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) array of a specific type and shape. */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&O&LO&ii", + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&iO&LO&ii", kwlist, PyArray_IntpConverter, &dims, PyArray_TypecodeConverter, &typecode, + &itemsize, PyArray_BufferConverter, &buffer, &offset, @@ -3571,6 +3575,13 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) typecode.type_num = PyArray_DOUBLE; typecode.itemsize = sizeof(double); } + /* An itemlen is used only if the typecode.itemsize is 0 */ + if ((itemsize != -1) && typecode.itemsize==0) { + if (typecode.type_num == PyArray_UNICODE) { + itemsize *= sizeof(Py_UNICODE); + } + typecode.itemsize = itemsize; + } type_num = typecode.type_num; itemsize = typecode.itemsize; @@ -3977,7 +3988,7 @@ array_nbytes_get(PyArrayObject *self) static PyObject * array_typechar_get(PyArrayObject *self) { - if PyArray_ISFLEXIBLE(self) + if PyArray_ISEXTENDED(self) return PyString_FromFormat("%c%d", (self->descr->type), self->itemsize); else @@ -4637,8 +4648,8 @@ _array_small_type(int chktype, int mintype, int chksize, int minsize, PyArray_Typecode *outtype) { outtype->type_num = MAX(chktype, mintype); - if (PyTypeNum_ISFLEXIBLE(outtype->type_num) && \ - (PyTypeNum_ISFLEXIBLE(mintype) || mintype==0)) { + if (PyTypeNum_ISEXTENDED(outtype->type_num) && \ + (PyTypeNum_ISEXTENDED(mintype) || mintype==0)) { /* Handle string->unicode case separately because string itemsize is twice as large */ if (outtype->type_num == PyArray_UNICODE && @@ -4858,7 +4869,7 @@ Array_FromScalar(PyObject *op, PyArray_Typecode *typecode) itemsize = typecode->itemsize; type = typecode->type_num; - if (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) { + if (itemsize == 0 && PyTypeNum_ISEXTENDED(type)) { itemsize = PyObject_Length(op); } @@ -4912,7 +4923,7 @@ Array_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, if(discover_dimensions(s,nd,d, !stop_at_string) == -1) { return NULL; } - if (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) { + if (itemsize == 0 && PyTypeNum_ISEXTENDED(type)) { if (discover_itemsize(s, nd, &itemsize) == -1) { return NULL; } @@ -5598,7 +5609,7 @@ array_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) PyObject *obj; descr = PyArray_DescrFromType(typecode->type_num); - if (PyTypeNum_ISFLEXIBLE(typecode->type_num)) { + if (PyTypeNum_ISEXTENDED(typecode->type_num)) { obj = PyString_FromFormat("%c%d", descr->type, typecode->itemsize); } @@ -7340,7 +7351,7 @@ PyArray_MultiIterNew(int n, ...) "array objects (inclusive).", MAX_DIMS); } - fprintf(stderr, "multi new..."); + /* fprintf(stderr, "multi new...");*/ multi = PyObject_New(PyArrayMultiIterObject, &PyArrayMultiIter_Type); if (multi == NULL) return NULL; @@ -7548,7 +7559,7 @@ static PyMethodDef arraymultiter_methods[] = { static PyTypeObject PyArrayMultiIter_Type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ - "scipy.multiter", /* tp_name */ + "scipy.broadcast", /* tp_name */ sizeof(PyArrayMultiIterObject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ diff --git a/scipy/base/src/multiarraymodule.c b/scipy/base/src/multiarraymodule.c index fd8cf4339..fdefb54e4 100644 --- a/scipy/base/src/multiarraymodule.c +++ b/scipy/base/src/multiarraymodule.c @@ -124,7 +124,7 @@ PyArray_View(PyArrayObject *self, PyArray_Typecode *type) PyArray_BASE(new) = (PyObject *)self; if ((type_num != PyArray_NOTYPE) && \ (type_num != self->descr->type_num)) { - if (!PyTypeNum_ISFLEXIBLE(type_num)) { + if (!PyTypeNum_ISEXTENDED(type_num)) { v = PyArray_TypeObjectFromType(type_num); } else { @@ -460,11 +460,13 @@ PyArray_Std(PyArrayObject *self, int axis, int rtype, int variance) if (n<=0) n=1; obj2 = PyFloat_FromDouble(1.0/((double )n)); if (obj2 == NULL) {Py_DECREF(obj1); return NULL;} - ret = PyArray_EnsureArray(PyNumber_Multiply(obj1, obj2)); + ret = PyNumber_Multiply(obj1, obj2); Py_DECREF(obj1); Py_DECREF(obj2); - if (variance) return PyArray_Return(ret); + if (variance) return ret; + + ret = PyArray_EnsureArray(ret); /* sqrt() */ obj1 = PyArray_GenericUnaryFunction((PyAO *)ret, n_ops.sqrt); @@ -2087,6 +2089,7 @@ PyArray_Correlate(PyObject *op1, PyObject *op2, int mode) return NULL; } + static PyObject * PyArray_ArgMin(PyArrayObject *ap, int axis) { @@ -4210,7 +4213,7 @@ DL_EXPORT(void) initmultiarray(void) { Py_INCREF(&PyArrayIter_Type); PyDict_SetItemString(d, "flatiter", (PyObject *)&PyArrayIter_Type); Py_INCREF(&PyArrayMultiIter_Type); - PyDict_SetItemString(d, "multiter", (PyObject *)&PyArrayMultiIter_Type); + PyDict_SetItemString(d, "broadcast", (PyObject *)&PyArrayMultiIter_Type); /* Doesn't need to be exposed to Python Py_INCREF(&PyArrayMapIter_Type); diff --git a/scipy/base/src/scalartypes.inc.src b/scipy/base/src/scalartypes.inc.src index 884d87aab..4945f130a 100644 --- a/scipy/base/src/scalartypes.inc.src +++ b/scipy/base/src/scalartypes.inc.src @@ -50,14 +50,14 @@ PyArray_ScalarAsCtype(PyObject *scalar, void *ctypeptr) PyArray_Typecode typecode; PyArray_TypecodeFromScalar(scalar, &typecode); - if (PyTypeNum_ISFLEXIBLE(typecode.type_num)) { + if (PyTypeNum_ISEXTENDED(typecode.type_num)) { void **newptr = (void **)ctypeptr; switch(typecode.type_num) { case PyArray_STRING: *newptr = (void *)PyString_AS_STRING(scalar); case PyArray_UNICODE: *newptr = (void *)PyUnicode_AS_DATA(scalar); - case PyArray_VOID: + default: *newptr = ((PyVoidScalarObject *)scalar)->obval; } return; @@ -81,8 +81,8 @@ PyArray_CastScalarToCtype(PyObject *scalar, void *ctypeptr, PyArray_TypecodeFromScalar(scalar, &incode); descr = PyArray_DescrFromType(incode.type_num); - if (PyTypeNum_ISFLEXIBLE(incode.type_num) || - PyTypeNum_ISFLEXIBLE(outcode->type_num)) { + if (PyTypeNum_ISEXTENDED(incode.type_num) || + PyTypeNum_ISEXTENDED(outcode->type_num)) { PyArrayObject *ain, *aout; ain = (PyArrayObject *)PyArray_FromScalar(scalar, NULL); @@ -129,11 +129,13 @@ PyArray_FromScalar(PyObject *scalar, PyArray_Typecode *outcode) case PyArray_UNICODE: memptr = (char *)PyUnicode_AS_DATA(scalar); break; - case PyArray_VOID: - memptr = (((PyVoidScalarObject *)scalar)->obval); - break; default: - memptr = _SOFFSET_(scalar, typecode.type_num); + if (PyTypeNum_ISEXTENDED(typecode.type_num)) { + memptr = (((PyVoidScalarObject *)scalar)->obval); + } + else { + memptr = _SOFFSET_(scalar, typecode.type_num); + } break; } @@ -147,7 +149,7 @@ PyArray_FromScalar(PyObject *scalar, PyArray_Typecode *outcode) return r; if (outcode->type_num == typecode.type_num) { - if (!PyTypeNum_ISFLEXIBLE(typecode.type_num)) + if (!PyTypeNum_ISEXTENDED(typecode.type_num)) return r; if (outcode->itemsize == typecode.itemsize) return r; @@ -1672,11 +1674,11 @@ PyArray_TypenumFromTypeObject(PyObject *type) i++; } - /* Seacrh any registered types */ + /* Search any registered types */ i = 0; while (i < PyArray_NUMUSERTYPES) { if (type == (PyObject *)(userdescrs[i]->typeobj)) { - typenum = i; + typenum = i + PyArray_USERDEF; break; } i++; @@ -1699,7 +1701,7 @@ PyArray_TypenumFromTypeObject(PyObject *type) return PyArray_ULONG; else if (type == (PyObject *) &PyCharacterArrType_Type) return PyArray_STRING; - else if (type == (PyObject *) &PyFlexibleArrType_Type) + else if (PyType_IsSubtype((PyTypeObject *)type, &PyFlexibleArrType_Type)) return PyArray_VOID; else if (type == (PyObject *)&PyBool_Type) typenum = PyArray_BOOL; @@ -1728,10 +1730,7 @@ PyArray_TypecodeFromTypeObject(PyObject *type, PyArray_Typecode *typecode) { type_num = PyArray_TypenumFromTypeObject(type); typecode->type_num = type_num; - if (PyTypeNum_ISFLEXIBLE(type_num)) { - itemsize = 0; - } - else { + if (!PyTypeNum_ISFLEXIBLE(type_num)) { PyArray_Descr *descr; descr = PyArray_DescrFromType(type_num); if (descr != NULL) @@ -1754,8 +1753,8 @@ PyArray_TypecodeFromScalar(PyObject *sc, PyArray_Typecode *typecode) typecode->itemsize = PyString_GET_SIZE(sc); else if (type_num == PyArray_UNICODE) typecode->itemsize = PyUnicode_GET_DATA_SIZE(sc); - else if (type_num == PyArray_VOID) { - typecode->itemsize = \ + else { + typecode->itemsize = \ ((PyVoidScalarObject *)sc)->ob_size; } } diff --git a/scipy/base/src/ufuncobject.c b/scipy/base/src/ufuncobject.c index ea3cf266c..ea1ec3bd4 100644 --- a/scipy/base/src/ufuncobject.c +++ b/scipy/base/src/ufuncobject.c @@ -602,11 +602,14 @@ select_types(PyUFuncObject *self, int *arg_types, for (i=self->nin; i<self->nargs; i++) { arg_types[i] = arg_types[0]; } - - key = PyInt_FromLong((long) arg_types[0]); - if (key == NULL) return -1; - obj = PyDict_GetItem(self->userloops, key); - Py_DECREF(key); + + obj = NULL; + if (self->userloops) { + key = PyInt_FromLong((long) arg_types[0]); + if (key == NULL) return -1; + obj = PyDict_GetItem(self->userloops, key); + Py_DECREF(key); + } if (obj == NULL) { PyErr_SetString(PyExc_TypeError, "no registered loop for this " \ |