numpy.nditer¶

class numpy.nditer[source]

Efficient multi-dimensional iterator object to iterate over arrays. To get started using this object, see the introductory guide to array iteration.

Notes

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 iterator’s coordinates or index, use the C-style pattern.

Examples

Here is how we might write an iter_add function, using the Python iterator protocol:

it = np.nditer([x, y, out], [],
for (a, b, c) in it:
return it.operands[2]

Here is the same function, but following the C-style pattern:

it = np.nditer([x, y, out], [],

while not it.finished:
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'],
op_axes=[range(x.ndim)+[-1]*y.ndim,
[-1]*x.ndim+range(y.ndim),
None])

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'],
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])

Attributes

 dtypes finished has_delayed_bufalloc has_index has_multi_index iterationneedsapi iterindex itersize ndim nop operands shape

Methods

 copy() Get a copy of the iterator in its current state. debug_print() Print the current state of the nditer instance and debug info to stdout. enable_external_loop() When the “external_loop” was not used during construction, but iternext() Check whether iterations are left, and perform a single internal iteration without returning the result. next x.next() -> the next value, or raise StopIteration remove_axis(i) Removes axis i from the iterator. remove_multi_index() When the “multi_index” flag was specified, this removes it, allowing reset() Reset the iterator to its initial state.

Previous topic

numpy.fill_diagonal

Next topic

numpy.nditer.dtypes