[Numpy-discussion] Forcing new dimensions to appear at front in advanced indexing (original) (raw)
Sebastian Berg sebastian at sipsolutions.net
Wed Jun 20 05:34:42 EDT 2018
- Previous message (by thread): [Numpy-discussion] Forcing new dimensions to appear at front in advanced indexing
- Next message (by thread): [Numpy-discussion] Forcing new dimensions to appear at front in advanced indexing
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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>
- Previous message (by thread): [Numpy-discussion] Forcing new dimensions to appear at front in advanced indexing
- Next message (by thread): [Numpy-discussion] Forcing new dimensions to appear at front in advanced indexing
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]