On Tue, 2018-06-19 at 19:37 -0400, Michael Lamparski wrote: > Hi all, > > So, in advanced indexing, numpy decides where to put new axes based > on whether the "advanced indices" are all next to each other. > > >>> np.random.random((3,4,5,6,7,8))[:, [[0,0],[0,0]], 1, :].shape > (3, 2, 2, 6, 7, 8) > >>> np.random.random((3,4,5,6,7,8))[:, [[0,0],[0,0]], :, 1].shape > (2, 2, 3, 5, 7, 8) > > In creating a wrapper type around arrays, I'm finding myself needing > to suppress this behavior, so that the new axes consistently appear > in the front. I thought of a dumb hat trick: > > def index(x, indices): > return x[(True, None) + indices] > > Which certainly gets the new dimensions where I want them, but it > introduces a ghost dimension of 1 (and sometimes two such > dimensions!) in a place where I'm not sure I can easily find it. > > >>> np.random.random((3,4,5,6,7,8))[True, None, 1].shape > (1, 1, 4, 5, 6, 7, 8) > >>> np.random.random((3,4,5,6,7,8))[True, None, :, [[0,0],[0,0]], 1, > :].shape > (2, 2, 1, 3, 6, 7, 8) > >>> np.random.random((3,4,5,6,7,8))[True, None, :, [[0,0],[0,0]], :, > 1].shape > (2, 2, 1, 3, 5, 7, 8) > > any better ideas? >
We have proposed `arr.vindex[...]` to do this and there are is a pure python implementation of it out there, I think it may be linked here somewhere: https://github.com/numpy/numpy/pull/6256 There is a way that will generally work using triple indexing: arr[..., None, None][orig_indx * (slice(None), np.array(0))][..., 0] The first and last indexing operation is just a view creation, so it is basically a no-op. Now doing this gives me the shiver, but it will work always. If you want to have a no-copy behaviour in case your original index is ont an advanced indexing operation, you should replace the np.array(0) with just 0. - Sebastian > --- > > Michael > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@python.org > https://mail.python.org/mailman/listinfo/numpy-discussion
signature.asc
Description: This is a digitally signed message part
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion