2015-12-09 10 views
11

Vorrei selezionare più intervalli non adiacenti da una matrice numerica 1d (o vettore).Indice gamme multiple non adiacenti in num.

Supponiamo:

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

Questo funziona, ovviamente:

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

E questo funziona per recuperare tramite singoli indici:

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

Ma cosa succede se voglio selezionare il intervalli 0:3 e 7:?

ho provato:

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

C'è un modo semplice per fare questo, o ho bisogno di generare separatamente e concatenare?

risposta

15

È necessario concatenare, prima o dopo l'indicizzazione. np.r_ facilita

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_ espande le fette e concatena.

Potete mescolare fette e liste:

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

Concatenating prima di indicizzazione è probabilmente più veloce di dopo, ma per serie 1D come questo, non credo che la differenza è significativa.