Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Index multiple, non-adjacent ranges in numpy

Tags:

python

numpy

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?

like image 725
alexw Avatar asked Dec 09 '15 20:12

alexw


1 Answers

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.

like image 149
hpaulj Avatar answered Sep 16 '22 13:09

hpaulj