10

I found a very similar question to mine, but not exactly the same. This one: here However in ntimes's case the size of the array matches the number of the dimensions the tuple is point at. In my case I have a 4-dimensional array and a 2-dimensional tuple, just like this:

from numpy.random import rand
big_array=rand(3,3,4,5)
tup=(2,2)

I want to use the tuple as an index to the first two dimensions, and manually index the last two. Something like:

big_array[tup,3,2]

However, I obtain a repetition of the first dimension with index=2, along the fourth dimension( since it technically hasn't been indexed). That is because this indexing is interpreting a double indexing to the first dimension instead of one value for each dimension,

eg. 
| dim 0:(index 2 AND index 2) , dim 1:(index 3), dim 2:(index 2), dim 3:(no index)|
instead of 
|dim 0(index 2), dim 1(index 2), dim 2:(index 3), dim 3:(index 2)|.

How can I 'unpack' this tuple then? Any ideas? thanks!

2 Answers 2

9

Since you're using numpy:

big_array[tup+(3,2)]

should work. When you call __getitem__ (via the square brackets), the stuff is passed to __getitem__ as a tuple. You just need to construct the tuple explicitly here (adding tuples together concatenates into a new tuple) and numpy will do what you want.

Sign up to request clarification or add additional context in comments.

1 Comment

simple and perfect, like a charm! I did not know you could do that with tuples, thank you!
4

You can also pass in your first tuple alone to get the slice of interest, then index it seprately:

from numpy.random import rand
big_array=rand(3,3,4,5)
chosen_slice = (2,2)

>>> big_array[ chosen_slice ]
array([[ 0.96281602,  0.38296561,  0.59362615,  0.74032818,  0.88169483],
       [ 0.54893771,  0.33640089,  0.53352849,  0.75534718,  0.38815883],
       [ 0.85247424,  0.9441886 ,  0.74682007,  0.87371017,  0.68644639],
       [ 0.52858188,  0.74717948,  0.76120181,  0.08314177,  0.99557654]])

>>> chosen_part = (1,1)

>>> big_array[ chosen_slice ][ chosen_part ]
0.33640088565877657

That may be slightly more readable for some users, but otherwise I'd lean towards mgilson's solution.

1 Comment

damn! I like it too! I would say this option is a bit more flexible since you can place it in 'middle' dimensions more straightforwardly. Something like: big_array[1][tup][2] works like a charm. Great insight, thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.