summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Berg <sebastian@sipsolutions.net>2012-10-21 17:48:14 +0200
committerSebastian Berg <sebastian@sipsolutions.net>2012-10-21 17:53:51 +0200
commitb46f589439201afabbcc9be586617e395ccc6c19 (patch)
tree0f28b3d901dac116d75f388c858c05d56a10eb40
parentfe6f42c427239d36579723085cc5207cedd8dcd1 (diff)
downloadnumpy-b46f589439201afabbcc9be586617e395ccc6c19.tar.gz
ENH: Do not rely on clean strides for loops.
In lowlevel_strided_loops.h, do not rely that the strides for contiguous arrays are set nicely since they can be considered not important if an axis dimensions is zero.
-rw-r--r--numpy/core/src/private/lowlevel_strided_loops.h46
1 files changed, 18 insertions, 28 deletions
diff --git a/numpy/core/src/private/lowlevel_strided_loops.h b/numpy/core/src/private/lowlevel_strided_loops.h
index a73dd12cf..e7a20a67a 100644
--- a/numpy/core/src/private/lowlevel_strided_loops.h
+++ b/numpy/core/src/private/lowlevel_strided_loops.h
@@ -552,10 +552,10 @@ PyArray_PrepareThreeRawArrayIter(int ndim, npy_intp *shape,
count = PyArray_SIZE(arr), \
data = PyArray_BYTES(arr), \
stride = ((PyArray_NDIM(arr) == 0) ? 0 : \
- (PyArray_CHKFLAGS(arr, NPY_ARRAY_F_CONTIGUOUS) ? \
+ ((PyArray_NDIM(arr) == 1) ? \
PyArray_STRIDE(arr, 0) : \
- PyArray_STRIDE(arr, \
- PyArray_NDIM(arr)-1)))
+ PyArray_DESCR(arr)->elsize)) \
+
#define PyArray_TRIVIALLY_ITERABLE_PAIR(arr1, arr2) (\
PyArray_TRIVIALLY_ITERABLE(arr1) && \
@@ -575,16 +575,12 @@ PyArray_PrepareThreeRawArrayIter(int ndim, npy_intp *shape,
count = ((size1 > size2) || size1 == 0) ? size1 : size2; \
data1 = PyArray_BYTES(arr1); \
data2 = PyArray_BYTES(arr2); \
- stride1 = (size1 == 1 ? 0 : \
- (PyArray_CHKFLAGS(arr1, NPY_ARRAY_F_CONTIGUOUS) ? \
- PyArray_STRIDE(arr1, 0) : \
- PyArray_STRIDE(arr1, \
- PyArray_NDIM(arr1)-1))); \
- stride2 = (size2 == 1 ? 0 : \
- (PyArray_CHKFLAGS(arr2, NPY_ARRAY_F_CONTIGUOUS) ? \
- PyArray_STRIDE(arr2, 0) : \
- PyArray_STRIDE(arr2, \
- PyArray_NDIM(arr2)-1))); \
+ stride1 = (size1 == 1 ? 0 : ((PyArray_NDIM(arr1) == 1) ? \
+ PyArray_STRIDE(arr1, 0) : \
+ PyArray_DESCR(arr1)->elsize)); \
+ stride2 = (size2 == 1 ? 0 : ((PyArray_NDIM(arr2) == 1) ? \
+ PyArray_STRIDE(arr2, 0) : \
+ PyArray_DESCR(arr2)->elsize)); \
}
#define PyArray_TRIVIALLY_ITERABLE_TRIPLE(arr1, arr2, arr3) (\
@@ -620,21 +616,15 @@ PyArray_PrepareThreeRawArrayIter(int ndim, npy_intp *shape,
data1 = PyArray_BYTES(arr1); \
data2 = PyArray_BYTES(arr2); \
data3 = PyArray_BYTES(arr3); \
- stride1 = (size1 == 1 ? 0 : \
- (PyArray_CHKFLAGS(arr1, NPY_ARRAY_F_CONTIGUOUS) ? \
- PyArray_STRIDE(arr1, 0) : \
- PyArray_STRIDE(arr1, \
- PyArray_NDIM(arr1)-1))); \
- stride2 = (size2 == 1 ? 0 : \
- (PyArray_CHKFLAGS(arr2, NPY_ARRAY_F_CONTIGUOUS) ? \
- PyArray_STRIDE(arr2, 0) : \
- PyArray_STRIDE(arr2, \
- PyArray_NDIM(arr2)-1))); \
- stride3 = (size3 == 1 ? 0 : \
- (PyArray_CHKFLAGS(arr3, NPY_ARRAY_F_CONTIGUOUS) ? \
- PyArray_STRIDE(arr3, 0) : \
- PyArray_STRIDE(arr3, \
- PyArray_NDIM(arr3)-1))); \
+ stride1 = (size1 == 1 ? 0 : ((PyArray_NDIM(arr1) == 1) ? \
+ PyArray_STRIDE(arr1, 0) : \
+ PyArray_DESCR(arr1)->elsize)); \
+ stride2 = (size2 == 1 ? 0 : ((PyArray_NDIM(arr2) == 1) ? \
+ PyArray_STRIDE(arr2, 0) : \
+ PyArray_DESCR(arr2)->elsize)); \
+ stride3 = (size3 == 1 ? 0 : ((PyArray_NDIM(arr3) == 1) ? \
+ PyArray_STRIDE(arr3, 0) : \
+ PyArray_DESCR(arr3)->elsize)); \
}
#endif