I have a variable, x, that is of the shape (2,2,50,100).
I also have an array, y, that equals np.array([0,10,20]). A weird thing happens when I index x[0,:,:,y].
x = np.full((2,2,50,100),np.nan)
y = np.array([0,10,20])
print(x.shape)
(2,2,50,100)
print(x[:,:,:,y].shape)
(2,2,50,3)
print(x[0,:,:,:].shape)
(2,50,100)
print(x[0,:,:,y].shape)
(3,2,50)
Why does the last one output (3,2,50) and not (2,50,3)?
It is called combining advanced and basic indexing. In combining advanced and basic indexing, numpy do the indexing in the advanced indexing first and subspace/concatenate the result to the dimension of basic indexing.
Example from docs:
Let x.shape be (10,20,30,40,50) and suppose ind_1 and ind_2 can be broadcast to the shape (2,3,4). Then x[:,ind_1,ind_2] has shape (10,2,3,4,40,50) because the (20,30)-shaped subspace from X has been replaced with the (2,3,4) subspace from the indices. However, x[:,ind_1,:,ind_2] has shape (2,3,4,10,30,50) because there is no unambiguous place to drop in the indexing subspace, thus it is tacked-on to the beginning. It is always possible to use .transpose() to move the subspace anywhere desired. Note that this example cannot be replicated using take.
so, on x[0,:,:,y], 0 and y are advance indexing. They are broadcast together to yield dimension (3,).
In [239]: np.broadcast(0,y).shape
Out[239]: (3,)
This (3,) tacks to the beginning of 2nd and 3rd dimension to make (3, 2, 50)
To see that the 1st and last dimension are really broadcasting together, you may try change 0 to [0,1] to see the error of broadcasting
print(x[[0,1],:,:,y])
Output:
IndexError Traceback (most recent call last)
<ipython-input-232-5d10156346f5> in <module>
----> 1 x[[0,1],:,:,y]
IndexError: shape mismatch: indexing arrays could not be broadcast together with
shapes (2,) (3,)