# Forcing new dimensions to appear at front in advanced indexing

4 messages
Open this post in threaded view
|

## Forcing new dimensions to appear at front in advanced indexing

 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?---Michael _______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion
Open this post in threaded view
|

## Re: Forcing new dimensions to appear at front in advanced indexing

 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/6256There 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 > [hidden email] > https://mail.python.org/mailman/listinfo/numpy-discussion_______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion signature.asc (849 bytes) Download Attachment