[Numpy-discussion] Reductions with nditer working only with the last axis

Sergio Pascual sergio.pasra at gmail.com
Thu Sep 27 12:08:11 EDT 2012


Hello, I'm trying to understand how to work with nditer to do a
reduction, in my case converting a 3d array into a 2d array.

I followed the help here
http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html and
managed to create a function that applies reduction over the last axis
of the input. With this function

def nditer_sum(data, red_axes):
    it = numpy.nditer([data, None],
                flags=['reduce_ok', 'external_loop'],
                op_flags=[['readonly'], ['readwrite', 'allocate']],
                op_axes=[None, red_axes])
    it.operands[1][...] = 0

    for x, y in it:
        y[...] = x.sum()

    return it.operands[1]

I can get something equivalent to data.sum(axis=2)

>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> nditer_sum(data, [0, 1, -1])
[[ 6 22 38]
 [54 70 86]]
>>> data.sum(axis=2)
[[ 6 22 38]
 [54 70 86]]

So to get something equivalent to data.sum(axis=0) I though that it
was enough to change  the argument red_axes to [-1, 0,1]
But the result is quite different.

>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> data.sum(axis=0)
[[12 14 16 18]
 [20 22 24 26]
 [28 30 32 34]]
>>> nditer_sum(data, [-1, 0, 1])
[[210 210 210 210]
 [210 210 210 210]
 [210 210 210 210]]

In the for loop inside nditer_sum (for x,y in it:), the iterator is
looping 2 times and giving an array of length 12 each time, instead of
looping 12 times and giving an array of length 2 each time. I have
read the numpy documentation several times and googled about this to
no avail.

Does anybody have an example of a reduction in the first axis of an
array using nditer? Is this a bug?


Regards, Sergio



More information about the NumPy-Discussion mailing list