summaryrefslogtreecommitdiff
path: root/numpy/core
diff options
context:
space:
mode:
authorEric Wieser <wieser.eric@gmail.com>2020-03-31 22:24:23 +0100
committerEric Wieser <wieser.eric@gmail.com>2020-03-31 23:11:58 +0100
commit5ae9f65f3d8a991baa14575af2b34c8665e97559 (patch)
treebdbd857c18418d7baeda0f0a34777752502e7784 /numpy/core
parent642181c76b11bd1cc87ee7443d3ee215744df0fd (diff)
downloadnumpy-5ae9f65f3d8a991baa14575af2b34c8665e97559.tar.gz
BUG: Respect itershape=() in nditer
Previously this was treated as itershape=None, which meant something else. The docstring was added only a handful of commits ago, so it shouldn't matter that the documented default "changed".
Diffstat (limited to 'numpy/core')
-rw-r--r--numpy/core/_add_newdocs.py2
-rw-r--r--numpy/core/src/multiarray/nditer_pywrap.c11
-rw-r--r--numpy/core/tests/test_nditer.py8
3 files changed, 12 insertions, 9 deletions
diff --git a/numpy/core/_add_newdocs.py b/numpy/core/_add_newdocs.py
index 68902d25a..b963f32b8 100644
--- a/numpy/core/_add_newdocs.py
+++ b/numpy/core/_add_newdocs.py
@@ -152,7 +152,7 @@ add_newdoc('numpy.core', 'flatiter', ('copy',
add_newdoc('numpy.core', 'nditer',
"""
- nditer(op, flags=None, op_flags=None, op_dtypes=None, order='K', casting='safe', op_axes=None, itershape=(), buffersize=0)
+ nditer(op, flags=None, op_flags=None, op_dtypes=None, order='K', casting='safe', op_axes=None, itershape=None, buffersize=0)
Efficient multi-dimensional iterator object to iterate over arrays.
To get started using this object, see the
diff --git a/numpy/core/src/multiarray/nditer_pywrap.c b/numpy/core/src/multiarray/nditer_pywrap.c
index add40f460..505c5a841 100644
--- a/numpy/core/src/multiarray/nditer_pywrap.c
+++ b/numpy/core/src/multiarray/nditer_pywrap.c
@@ -17,6 +17,7 @@
#include "npy_pycompat.h"
#include "alloc.h"
#include "common.h"
+#include "conversion_utils.h"
#include "ctors.h"
/* Functions not part of the public NumPy C API */
@@ -748,7 +749,7 @@ npyiter_init(NewNpyArrayIterObject *self, PyObject *args, PyObject *kwds)
int oa_ndim = -1;
int op_axes_arrays[NPY_MAXARGS][NPY_MAXDIMS];
int *op_axes[NPY_MAXARGS];
- PyArray_Dims itershape = {NULL, 0};
+ PyArray_Dims itershape = {NULL, -1};
int buffersize = 0;
if (self->iter != NULL) {
@@ -765,7 +766,7 @@ npyiter_init(NewNpyArrayIterObject *self, PyObject *args, PyObject *kwds)
npyiter_order_converter, &order,
PyArray_CastingConverter, &casting,
&op_axes_in,
- PyArray_IntpConverter, &itershape,
+ PyArray_OptionalIntpConverter, &itershape,
&buffersize)) {
npy_free_cache_dim_obj(itershape);
return -1;
@@ -800,7 +801,7 @@ npyiter_init(NewNpyArrayIterObject *self, PyObject *args, PyObject *kwds)
}
}
- if (itershape.len > 0) {
+ if (itershape.len != -1) {
if (oa_ndim == -1) {
oa_ndim = itershape.len;
memset(op_axes, 0, sizeof(op_axes[0]) * nop);
@@ -812,10 +813,6 @@ npyiter_init(NewNpyArrayIterObject *self, PyObject *args, PyObject *kwds)
goto fail;
}
}
- else if (itershape.ptr != NULL) {
- npy_free_cache_dim_obj(itershape);
- itershape.ptr = NULL;
- }
self->iter = NpyIter_AdvancedNew(nop, op, flags, order, casting, op_flags,
op_request_dtypes,
diff --git a/numpy/core/tests/test_nditer.py b/numpy/core/tests/test_nditer.py
index 24272bb0d..7eca9ec3a 100644
--- a/numpy/core/tests/test_nditer.py
+++ b/numpy/core/tests/test_nditer.py
@@ -2688,7 +2688,13 @@ def test_0d_iter():
i = nditer(np.arange(5), ['multi_index'], [['readonly']], op_axes=[()])
assert_equal(i.ndim, 0)
assert_equal(len(i), 1)
- # note that itershape=(), still behaves like None due to the conversions
+
+ i = nditer(np.arange(5), ['multi_index'], [['readonly']], op_axes=[()], itershape=())
+ assert_equal(i.ndim, 0)
+ assert_equal(len(i), 1)
+
+ # passing an itershape alone is not enough, the op_axes are also needed
+ assert_raises(ValueError, nditer, np.arange(5), ['multi_index'], [['readonly']], itershape=())
# Test a more complex buffered casting case (same as another test above)
sdt = [('a', 'f4'), ('b', 'i8'), ('c', 'c8', (2, 3)), ('d', 'O')]