[Numpy-discussion] Forcing new dimensions to appear at front in advanced indexing

Sebastian Berg sebastian at sipsolutions.net
Wed Jun 20 05:34:42 EDT 2018


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 at python.org
> https://mail.python.org/mailman/listinfo/numpy-discussion
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20180620/16fdc492/attachment.sig>


More information about the NumPy-Discussion mailing list