On Tue, 2020-05-19 at 17:11 +0100, Eric Wieser wrote:

> Hi Will,

>

> To force an iteration to run along certain axes, I believe you should

> be

> using `op_axes`. Your diagnosis is correct that `external_loop` is

> trying

> to help you be more optimal, since it's purpose is exactly that:

> optimization.

>

> Unfortunately, if you use `op_axes` you'll run into

>

https://github.com/numpy/numpy/issues/9808.

Yeah, I do not think what you want is possible with nditer. `op_axes`

allows you to ignore certain axis, but as Eric points out, that

actually ignores that axis entirely. So it acts similar to slicing the

whole axis away.

I previously thought it could be nice to have a new

`arr.iteraxis(axis=None)` command. As a base, it would act like a flat

iter, otherwise iterate the axis listed. Maybe with an additional flag

whether its allowed to optimize iteration order (although from the

python side I expect we do not want to do that by default).

The reason is also that I am not sure I like `arr.flat` and `for subarr

in arr` too much, because the list-of-list like iteration seems only

semi-natural for an N-D array.

- Sebastian

>

> Eric

>

> On Tue, 19 May 2020 at 00:42, William Ayd <

[hidden email]>

> wrote:

>

> > I am trying to use the nditer to traverse each column of a 2D

> > array,

> > returning the column as a 1D array. Consulting the docs, I found

> > this

> > example which works perfectly fine:

> >

> > In [*65*]: a = np.arange(6).reshape(2,3)

> >

> >

> >

> > In [*66*]: *for* x *in* np.nditer(a, flags=['external_loop'],

> > order='F'):

> > ...: print(x, end=' ')

> > ...:

> >

> >

> > [0 3] [1 4] [2 5]

> >

> > When changing the shape of the input array to (1, 3) however, this

> > doesn’t

> > yield what I am hoping for any more (essentially [0], [1] [2]):

> >

> > In [*68*]: *for* x *in* np.nditer(a, flags=['external_loop'],

> > order='F'):

> > ...: print(x, end=' ')

> > ...:

> >

> >

> > [0 1 2]

> >

> > I suspect this may have to do with the fact that the (1, 3) array

> > is both

> > C and F contiguous, and it is trying to return as large of a 1D

> > F-contiguous array as it can. However, I didn’t see any way to

> > really force

> > it to go by columns. My best guess was the *itershape* argument

> > though I

> > couldn’t figure out how to get that to work and didn’t see much in

> > the

> > documentation.

> >

> > Thanks in advance for the help!

> >

> > - Will

> >

> >

> >

> > _______________________________________________

> > NumPy-Discussion mailing list

> >

[hidden email]
> >

https://mail.python.org/mailman/listinfo/numpy-discussion> >

>

> _______________________________________________

> NumPy-Discussion mailing list

>

[hidden email]
>

https://mail.python.org/mailman/listinfo/numpy-discussion_______________________________________________

NumPy-Discussion mailing list

[hidden email]
https://mail.python.org/mailman/listinfo/numpy-discussion