2014-09-16 25 views
40

Sono un principiante con Numpy e sto cercando di estrarre alcuni dati da una lunga serie numpy. Quello che devo fare è iniziare da una posizione definita nel mio array e quindi sottocampionare ogni n ° punto dati da quella posizione, fino alla fine del mio array.sottocampionamento ogni ennesima voce in una serie numpy

in fondo se ho avuto

a = [1,2,3,4,1,2,3,4,1,2,3,4....] 

Voglio sottocampionare questo per iniziare a a[1] e poi assaggiare ogni quarto punto da lì, a produrre qualcosa di simile

b = [2,2,2.....] 

risposta

72

È possibile utilizzare numpy's slicing, semplicemente start:stop:step.

>>> xs 
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]) 
>>> xs[1::4] 
array([2, 2, 2]) 

Questo crea una vista dei dati originali, quindi è costante di tempo. Sarà anche riflettere le modifiche alla matrice originale e mantenere tutta la matrice originale nella memoria:

>>> a 
array([1, 2, 3, 4, 5]) 
>>> b = a[::2]   # O(1), constant time 
>>> b[:] = 0   # modifying the view changes original array 
>>> a     # original array is modified 
array([0, 2, 0, 4, 0]) 

quindi se una delle cose di cui sopra sono un problema, è possibile effettuare una copia in modo esplicito:

>>> a 
array([1, 2, 3, 4, 5]) 
>>> b = a[::2].copy() # explicit copy, O(n) 
>>> b[:] = 0   # modifying the copy 
>>> a     # original is intact 
array([1, 2, 3, 4, 5]) 

Questo non è un tempo costante, ma il risultato non è legato alla matrice originale. La copia è anche contigua nella memoria, che può rendere più veloci alcune operazioni su di essa.

+0

grazie per l'avviso sulla copia di riferimento/valore. altrimenti cadrebbe sicuramente nella trappola – Chris