# Index multiple, non-adjacent ranges in numpy

## Question:

I’d like to select multiple, non-adjacent ranges from a 1d numpy array (or vector).

Suppose:

``````>>> idx = np.random.randint(100, size=10)
array([82,  9, 11, 94, 31, 87, 43, 77, 49, 50])
``````

This works, of course:

``````>>> idx[0:3]
array([82,  9, 11])
``````

And this works to fetch via individual indices:

``````>>> idx[[0,3,4]]
array([82, 94, 31])
``````

But what if I want to select the ranges `0:3`, and `7:`?

I’ve tried:

``````>>> idx[[0:3,7:]]
SyntaxError: invalid syntax
``````

Is there a simple way to do this, or do I need to generate them separately and concatenate?

You need to concatenate, either before or after indexing. `np.r_` makes it easy

``````In [116]: idx=np.array([82,  9, 11, 94, 31, 87, 43, 77, 49, 50])
In [117]: np.r_[0:3,7:10]
Out[117]: array([0, 1, 2, 7, 8, 9])
In [118]: idx[np.r_[0:3,7:10]]
Out[118]: array([82,  9, 11, 77, 49, 50])
``````

`np.r_` expands the slices and concatenates them.

You can mix slices and lists:

``````In [120]: np.r_[0:3,7:10,[0,3,4]]
Out[120]: array([0, 1, 2, 7, 8, 9, 0, 3, 4])
``````

Concatenating before indexing is probably faster than after, but for 1d array like this, I don’t think the difference is significant.

Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.