submuestreo de cada enésima entrada en una matriz numpy

96

Soy un principiante con numpy y estoy tratando de extraer algunos datos de una matriz larga de numpy. Lo que tengo que hacer es comenzar desde una posición definida en mi matriz y luego submuestrear cada enésimo punto de datos desde esa posición, hasta el final de mi matriz.

básicamente si tuviera

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

Quiero submuestrear esto para comenzar a[1]y luego muestrear cada cuarto punto desde allí, para producir algo como

b = [2,2,2.....]
Rich Williams
fuente

Respuestas:

163

Puedes usar el corte de numpy , simplemente start:stop:step.

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

Esto crea una vista de los datos originales, por lo que es un tiempo constante . También reflejará los cambios en la matriz original y mantendrá toda la matriz original en la 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])

así que si cualquiera de las cosas anteriores es un problema, puede hacer una copia explícitamente:

>>> 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])

Este no es un tiempo constante, pero el resultado no está vinculado a la matriz original. La copia también está contigua en la memoria, lo que puede hacer que algunas operaciones sean más rápidas.

behzad.nouri
fuente
1
gracias por advertir sobre la copia de referencia / valor. De lo contrario, definitivamente caería en la trampa
Forever