2015-12-09 1 views
11

Chciałbym wybrać wiele nie sąsiadujących zakresów z tablicy 1d numpy (lub wektora).Indeksuj wiele, niesąsiadujących zakresów w numpy

Załóżmy:

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

Działa to oczywiście:

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

I to działa, aby pobrać za pośrednictwem poszczególnych indeksów:

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

Ale co, jeśli chcę, aby wybrać zakresy 0:3 i 7:?

Próbowałem:

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

Czy istnieje prosty sposób to zrobić, czy trzeba wygenerować je oddzielnie i łączyć?

Odpowiedz

15

Konieczne jest połączenie, przed lub po indeksowaniu. np.r_ ułatwia

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_ rozszerza plastry i łączy je.

Można mieszać plasterki i list:

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

Konkatenowanie przed indeksowanie jest prawdopodobnie szybciej niż później, ale za 1d tablicy jak to, nie sądzę, różnica jest znacząca.