Consider the following numpy array.
a = np.random.randn(10, 3, 20)
When I index the array as follow, it produces another array with expected shape
b = a[0, :, 0:5]
b.shape = (3, 5)
But when I index it with another numpy array but with similar elements, it produces a different array, which is transpose of the above result.
j = np.arange(0, 5, 1)
b = a[0, :, j]
b.shape = (5, 3)
I couldn't understand why this is the case.
CodePudding user response:
Tim Roberts summarized it excellently in the comments, which I'll quote here in case the comments are cleaned up:
It's subtle. The second example is concatenating a set of slices. If you print
a[0,:,0]
, you'll see a 3-element slice, equal to the first row of the final b. Same witha[0,:,1]
. The magic indexing takes those 5 3-element slices and returns then in a new array. A set of 5 slices is different from the array subset ina[0,:,0:5]
.
In addition, if you notice, the two different indexing methods actually produce equivalent results; they're just transposed versions of each other. So a[0, :, np.arange(5)] == a[0, :, 0:5].T
and a[0, :, np.arange(5)].T == a[0, :, 0:5]
.