4

I have the following minimal example:

a = np.zeros((5,5,5))
a[1,1,:] = [1,1,1,1,1]
print(a[1,:,range(4)])

I would expect as output an array with 5 rows and 4 columns, where we have ones on the second row. Instead it is an array with 4 rows and 5 columns with ones on the second column. What is happening here, and what can I do to get the output I expected?

1
  • May I ask why I get downvoted? Is my question too simple or ill posed? Commented Aug 3, 2017 at 8:16

1 Answer 1

8

This is an example of mixed basic and advanced indexing, as discussed in https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

The slice dimension has been appended to the end.

With one scalar index this is a marginal case for the ambiguity described there. It's been discussed in previous SO questions and one or more bug/issues.

Numpy sub-array assignment with advanced, mixed indexing

In this case you can replace the range with a slice, and get the expected order:

In [215]: a[1,:,range(4)].shape
Out[215]: (4, 5)               # slice dimension last
In [216]: a[1,:,:4].shape
Out[216]: (5, 4)
In [219]: a[1][:,[0,1,3]].shape
Out[219]: (5, 3)
Sign up to request clarification or add additional context in comments.

3 Comments

Is there also a simple workaround as a[1,:,: :4] in case I would want to take a[1,:,[0,1,3]] etc. (i.e. all except one value in the last index)
Perfect, thanks very useful and easy to understand, thanks!
I think the first link is expired and linked to the wrong place.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.