summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2005-10-20 02:39:34 +0000
committerTravis Oliphant <oliphant@enthought.com>2005-10-20 02:39:34 +0000
commitf42cec1a298dc8c97faa6bf4ceeaf8e90bf381e8 (patch)
treea3921b94c61505fc8e6a4cea2a07160274db13a8
parent725916514e034832db296202bd150895da109266 (diff)
downloadnumpy-f42cec1a298dc8c97faa6bf4ceeaf8e90bf381e8.tar.gz
Transpose fixes --- flags needed fixing before calling copy_ND_array.
-rw-r--r--scipy/base/src/arrayobject.c3
-rw-r--r--scipy/base/src/ufuncobject.c3
-rw-r--r--scipy/f2py2e/src/fortranobject.c42
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); */