Issue
Why are the following indexing forms produce differently shaped outputs?
a = np.zeros((5, 5, 5, 5))
print(a[:, :, [1, 2], [3, 4]].shape)
# (5, 5, 2)
print(a[:, :, 1:3, [3, 4]].shape)
#(5, 5, 2, 2)
Almost certain I’m missing something obvious.
Solution
The first one,
a[:, :, [1, 2], [3, 4]]
takes indices pairwise and selects the following subarrays:
a[:, :, 1, 3]
a[:, :, 2, 4]
whereas the second one generates all possible combos (and shapes it accordingly), i.e.
a[:, :, 1, 3]
a[:, :, 1, 4]
a[:, :, 2, 3]
a[:, :, 2, 4]
This can be verified by running the following exercise. Rather than initializing a
as a zero array, use np.arange
and reshape it
a = np.arange(5**4).reshape((5, 5, 5, 5))
print(a[:, :, [1, 2], [3, 4]])
The first few lines of the output are
[[[ 8 14]
[ 33 39]
[ 58 64]...
and the array a
itself is
[[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[ 10 11 12 13 14]
[ 15 16 17 18 19]
[ 20 21 22 23 24]]...
So 8 comes at (1,3) (In the innermost 2D array, 1: 2nd row, 3:4th column) as expected and 14 comes at (2, 4). Similarly, 33 is also at index (1,3) and 39 at (2,4) in the next 2D subarray.
Answered By – R. S. Nikhil Krishna
Answer Checked By – Katrina (BugsFixing Volunteer)