nditer(op, flags=None, op_flags=None, op_dtypes=None, order='K', casting='safe', op_axes=None, itershape=None, buffersize=0)
The data types of the values provided in :None:None:`value`
. This may be different from the operand data types if buffering is enabled. Valid only before the iterator is closed.
Whether the iteration over the operands is finished or not.
If True, the iterator was created with the delay_bufalloc
flag, and no reset() function was called on it yet.
If True, the iterator was created with either the c_index
or the f_index
flag, and the property :None:None:`index`
can be used to retrieve it.
If True, the iterator was created with the multi_index
flag, and the property :None:None:`multi_index`
can be used to retrieve it.
When the c_index
or f_index
flag was used, this property provides access to the index. Raises a ValueError if accessed and has_index
is False.
Whether iteration requires access to the Python API, for example if one of the operands is an object array.
An index which matches the order of iteration.
Size of the iterator.
Structured view(s) of :None:None:`operands`
in memory, matching the reordered and optimized iterator access pattern. Valid only before the iterator is closed.
When the multi_index
flag was used, this property provides access to the index. Raises a ValueError if accessed accessed and has_multi_index
is False.
The dimensions of the iterator.
The number of iterator operands.
The array(s) to be iterated over. Valid only before the iterator is closed.
Shape tuple, the shape of the iterator.
Value of operands
at current iteration. Normally, this is a tuple of array scalars, but if the flag external_loop
is used, it is a tuple of one dimensional arrays.
nditer
supersedes flatiter
. The iterator implementation behind nditer
is also exposed by the NumPy C API.
The Python exposure supplies two iteration interfaces, one which follows the Python iterator protocol, and another which mirrors the C-style do-while pattern. The native Python approach is better in most cases, but if you need the coordinates or index of an iterator, use the C-style pattern.
The array(s) to iterate over.
Flags to control the behavior of the iterator.
buffered
enables buffering when required.
c_index
causes a C-order index to be tracked.
f_index
causes a Fortran-order index to be tracked.
multi_index
causes a multi-index, or a tuple of indices with one per iteration dimension, to be tracked.
common_dtype
causes all the operands to be converted to a common data type, with copying or buffering as necessary.
copy_if_overlap
causes the iterator to determine if read operands have overlap with write operands, and make temporary copies as necessary to avoid overlap. False positives (needless copying) are possible in some cases.
delay_bufalloc
delays allocation of the buffers until a reset() call is made. Allows allocate
operands to be initialized before their values are copied into the buffers.
external_loop
causes the values
given to be one-dimensional arrays with multiple values instead of zero-dimensional arrays.
grow_inner
allows the value
array sizes to be made larger than the buffer size when both buffered
and external_loop
is used.
ranged
allows the iterator to be restricted to a sub-range of the iterindex values.
refs_ok
enables iteration of reference types, such as object arrays.
reduce_ok
enables iteration of readwrite
operands which are broadcasted, also known as reduction operands.
zerosize_ok
allows :None:None:`itersize`
to be zero.
This is a list of flags for each operand. At minimum, one of readonly
, readwrite
, or writeonly
must be specified.
readonly
indicates the operand will only be read from.
readwrite
indicates the operand will be read from and written to.
writeonly
indicates the operand will only be written to.
no_broadcast
prevents the operand from being broadcasted.
contig
forces the operand data to be contiguous.
aligned
forces the operand data to be aligned.
nbo
forces the operand data to be in native byte order.
copy
allows a temporary read-only copy if required.
updateifcopy
allows a temporary read-write copy if required.
allocate
causes the array to be allocated if it is None in the op
parameter.
no_subtype
prevents an allocate
operand from using a subtype.
arraymask
indicates that this operand is the mask to use for selecting elements when writing to operands with the 'writemasked' flag set. The iterator does not enforce this, but when writing from a buffer back to the array, it only copies those elements indicated by this mask.
writemasked
indicates that only elements where the chosen arraymask
operand is True will be written to.
overlap_assume_elementwise
can be used to mark operands that are accessed only in the iterator order, to allow less conservative copying when copy_if_overlap
is present.
The required data type(s) of the operands. If copying or buffering is enabled, the data will be converted to/from their original types.
Controls the iteration order. 'C' means C order, 'F' means Fortran order, 'A' means 'F' order if all the arrays are Fortran contiguous, 'C' order otherwise, and 'K' means as close to the order the array elements appear in memory as possible. This also affects the element memory order of allocate
operands, as they are allocated to be compatible with iteration order. Default is 'K'.
Controls what kind of data casting may occur when making a copy or buffering. Setting this to 'unsafe' is not recommended, as it can adversely affect accumulations.
'no' means the data types should not be cast at all.
'equiv' means only byte-order changes are allowed.
'safe' means only casts which can preserve values are allowed.
'same_kind' means only safe casts or casts within a kind, like float64 to float32, are allowed.
'unsafe' means any data conversions may be done.
If provided, is a list of ints or None for each operands. The list of axes for an operand is a mapping from the dimensions of the iterator to the dimensions of the operand. A value of -1 can be placed for entries, causing that dimension to be treated as :None:None:`newaxis`
.
The desired shape of the iterator. This allows allocate
operands with a dimension mapped by op_axes not corresponding to a dimension of a different operand to get a value not equal to 1 for that dimension.
When buffering is enabled, controls the size of the temporary buffers. Set to 0 for the default value.
Efficient multi-dimensional iterator object to iterate over arrays. To get started using this object, see the introductory guide to array iteration <arrays.nditer>
.
Here is how we might write an iter_add
function, using the Python iterator protocol:
>>> def iter_add_py(x, y, out=None):
... addop = np.add
... it = np.nditer([x, y, out], [],
... [['readonly'], ['readonly'], ['writeonly','allocate']])
... with it:
... for (a, b, c) in it:
... addop(a, b, out=c)
... return it.operands[2]
Here is the same function, but following the C-style pattern:
>>> def iter_add(x, y, out=None):
... addop = np.add
... it = np.nditer([x, y, out], [],
... [['readonly'], ['readonly'], ['writeonly','allocate']])
... with it:
... while not it.finished:
... addop(it[0], it[1], out=it[2])
... it.iternext()
... return it.operands[2]
Here is an example outer product function:
>>> def outer_it(x, y, out=None):
... mulop = np.multiply
... it = np.nditer([x, y, out], ['external_loop'],
... [['readonly'], ['readonly'], ['writeonly', 'allocate']],
... op_axes=[list(range(x.ndim)) + [-1] * y.ndim,
... [-1] * x.ndim + list(range(y.ndim)),
... None])
... with it:
... for (a, b, c) in it:
... mulop(a, b, out=c)
... return it.operands[2]
>>> a = np.arange(2)+1
... b = np.arange(3)+1
... outer_it(a,b) array([[1, 2, 3], [2, 4, 6]])
Here is an example function which operates like a "lambda" ufunc:
>>> def luf(lamdaexpr, *args, **kwargs):
... '''luf(lambdaexpr, op1, ..., opn, out=None, order='K', casting='safe', buffersize=0)'''
... nargs = len(args)
... op = (kwargs.get('out',None),) + args
... it = np.nditer(op, ['buffered','external_loop'],
... [['writeonly','allocate','no_broadcast']] +
... [['readonly','nbo','aligned']]*nargs,
... order=kwargs.get('order','K'),
... casting=kwargs.get('casting','safe'),
... buffersize=kwargs.get('buffersize',0))
... while not it.finished:
... it[0] = lamdaexpr(*it[1:])
... it.iternext()
... return it.operands[0]
>>> a = np.arange(5)
... b = np.ones(5)
... luf(lambda i,j:i*i + j/2, a, b) array([ 0.5, 1.5, 4.5, 9.5, 16.5])
If operand flags :None:None:`"writeonly"`
or :None:None:`"readwrite"`
are used the operands may be views into the original data with the :None:None:`WRITEBACKIFCOPY`
flag. In this case nditer
must be used as a context manager or the :None:None:`nditer.close`
method must be called before using the result. The temporary data will be written back to the original data when the :None:None:`__exit__`
function is called but not before:
>>> a = np.arange(6, dtype='i4')[::-2]
... with np.nditer(a, [],
... [['writeonly', 'updateifcopy']],
... casting='unsafe',
... op_dtypes=[np.dtype('f4')]) as i:
... x = i.operands[0]
... x[:] = [-1, -2, -3]
... # a still unchanged here
... a, x (array([-1, -2, -3], dtype=int32), array([-1., -2., -3.], dtype=float32))
It is important to note that once the iterator is exited, dangling references (like x
in the example) may or may not share data with the original data a
. If writeback semantics were active, i.e. if :None:None:`x.base.flags.writebackifcopy`
is :None:None:`True`
, then exiting the iterator will sever the connection between x
and a
, writing to x
will no longer write to a
. If writeback semantics are not active, then :None:None:`x.data`
will still point at some part of :None:None:`a.data`
, and writing to one will affect the other.
Context management and the close
method appeared in version 1.15.0.
The following pages refer to to this document either explicitly or contain code examples using this.
numpy.nditer
numpy.nested_iters
Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.
Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)
SVG is more flexible but power hungry; and does not scale well to 50 + nodes.
All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them