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 <william....@icloud.com> > 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 > > NumPy-Discussion@python.org > > https://mail.python.org/mailman/listinfo/numpy-discussion > > > > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@python.org > https://mail.python.org/mailman/listinfo/numpy-discussion _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion