diff options
author | Travis Oliphant <oliphant@enthought.com> | 2005-10-20 02:39:34 +0000 |
---|---|---|
committer | Travis Oliphant <oliphant@enthought.com> | 2005-10-20 02:39:34 +0000 |
commit | f42cec1a298dc8c97faa6bf4ceeaf8e90bf381e8 (patch) | |
tree | a3921b94c61505fc8e6a4cea2a07160274db13a8 | |
parent | 725916514e034832db296202bd150895da109266 (diff) | |
download | numpy-f42cec1a298dc8c97faa6bf4ceeaf8e90bf381e8.tar.gz |
Transpose fixes --- flags needed fixing before calling copy_ND_array.
-rw-r--r-- | scipy/base/src/arrayobject.c | 3 | ||||
-rw-r--r-- | scipy/base/src/ufuncobject.c | 3 | ||||
-rw-r--r-- | scipy/f2py2e/src/fortranobject.c | 42 |
3 files changed, 36 insertions, 12 deletions
diff --git a/scipy/base/src/arrayobject.c b/scipy/base/src/arrayobject.c index 9413bc98a..8d9b207eb 100644 --- a/scipy/base/src/arrayobject.c +++ b/scipy/base/src/arrayobject.c @@ -640,7 +640,7 @@ PyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src) elsize = dest->itemsize; - if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \ + if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \ || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) { PyArray_XDECREF(dest); @@ -2985,7 +2985,6 @@ _IsFortranContiguous(PyArrayObject *ap) return 1; } - static int _IsAligned(PyArrayObject *ap) { diff --git a/scipy/base/src/ufuncobject.c b/scipy/base/src/ufuncobject.c index 2f7bc6f6e..ccec5e230 100644 --- a/scipy/base/src/ufuncobject.c +++ b/scipy/base/src/ufuncobject.c @@ -2228,7 +2228,10 @@ PyUFunc_GenericReduction(PyUFuncObject *self, PyObject *args, return NULL; } + /* Get default type to reduce over if not given */ if (otype.type_num == PyArray_NOTYPE) { + /* For integer types --- makes sure at + least a long is used */ int typenum = PyArray_TYPE(mp); if (PyTypeNum_ISINTEGER(typenum) && \ (mp->itemsize < sizeof(long))) { diff --git a/scipy/f2py2e/src/fortranobject.c b/scipy/f2py2e/src/fortranobject.c index 4d2d31f51..556dcd5db 100644 --- a/scipy/f2py2e/src/fortranobject.c +++ b/scipy/f2py2e/src/fortranobject.c @@ -522,6 +522,21 @@ static int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) { return 0; } + /* useful after a lazy-transpose to update the flags + quickly + */ + +#define _lazy_transpose_update_flags(obj) { \ + if (PyArray_ISCONTIGUOUS(obj)) { \ + PyArray_FLAGS(obj) &= ~CONTIGUOUS; \ + PyArray_FLAGS(obj) |= FORTRAN; \ + } \ + else if PyArray_CHKFLAGS(obj, FORTRAN) { \ + PyArray_FLAGS(obj) &= ~FORTRAN; \ + PyArray_FLAGS(obj) |= CONTIGUOUS; \ + } \ + } + extern PyArrayObject* array_from_pyobj(const int type_num, intp *dims, @@ -550,7 +565,7 @@ PyArrayObject* array_from_pyobj(const int type_num, } if (PyArray_Check(obj) - && ISCONTIGUOUS((PyArrayObject *)obj) + && PyArray_ISONESEGMENT(obj) && HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num) ) { if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims)) @@ -606,6 +621,7 @@ PyArrayObject* array_from_pyobj(const int type_num, } if ((rank>1) && (! (intent & F2PY_INTENT_C))) { lazy_transpose(arr); + _lazy_transpose_update_flags(arr); } /* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */ /* tmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */ @@ -621,7 +637,8 @@ PyArrayObject* array_from_pyobj(const int type_num, } if ((rank>1) && (! (intent & F2PY_INTENT_C))) { lazy_transpose(arr); - lazy_transpose(tmp_arr); + _lazy_transpose_update_flags(arr); + lazy_transpose(tmp_arr); tmp_arr->flags &= ~CONTIGUOUS; tmp_arr->flags |= FORTRAN; } @@ -671,19 +688,24 @@ PyArrayObject* array_from_pyobj(const int type_num, if ((rank>1) && (! (intent & F2PY_INTENT_C))) { PyArrayObject *tmp_arr = NULL; - lazy_transpose(arr); - arr->flags &= ~CONTIGUOUS; - arr->flags |= FORTRAN; - tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0); + if (rank == 2) { + tmp_arr = (PyArrayObject *) PyArray_CopyAndTranspose((PyObject *)arr); + PyArray_UpdateFlags(tmp_arr, CONTIGUOUS | FORTRAN); + } + else { + lazy_transpose(arr); + arr->flags &= ~CONTIGUOUS; + arr->flags |= FORTRAN; + tmp_arr = (PyArrayObject *) PyArray_Copy(arr); + } #ifdef F2PY_REPORT_ON_ARRAY_COPY - f2py_report_on_array_copy(tmp_arr,"PyArray_CopyFromObject"); + f2py_report_on_array_copy(tmp_arr,"PyArray_Copy"); #endif Py_DECREF(arr); arr = tmp_arr; - ARR_IS_NULL(arr==NULL,"CopyFromObject(Array) failed: intent(fortran)\n"); + ARR_IS_NULL(arr==NULL,"Copy(Array) failed: intent(fortran)\n"); lazy_transpose(arr); - arr->flags &= ~CONTIGUOUS; - arr->flags |= FORTRAN; + _lazy_transpose_update_flags(arr); } /* if (intent & F2PY_INTENT_OUT) */ /* Py_INCREF(arr); */ |