subamostrando cada enésima entrada em uma matriz numpy

93

Eu sou um iniciante com numpy e estou tentando extrair alguns dados de uma longa matriz numpy. O que eu preciso fazer é começar a partir de uma posição definida em meu array e, em seguida, subamostrar cada enésimo ponto de dados dessa posição, até o final de meu array.

basicamente se eu tivesse

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

Quero subamostrar isso para começar a[1]e, em seguida, amostrar cada quarto ponto a partir daí, para produzir algo como

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

Respostas:

154

Você pode usar o corte do numpy , simplesmente start:stop:step.

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

Isso cria uma visualização dos dados originais, portanto, é um tempo constante . Ele também refletirá as alterações no array original e manterá todo o array original na memória:

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

então, se alguma das coisas acima for um problema, você pode fazer uma cópia explicitamente:

>>> 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 não é um tempo constante, mas o resultado não está vinculado ao array original. A cópia também é contígua à memória, o que pode tornar algumas operações mais rápidas.

behzad.nouri
fonte
1
obrigado por avisar sobre a cópia de referência / valor. Eu definitivamente cairia na armadilha
Chris