podpróbkowanie co n-tego wpisu w tablicy numpy

95

Jestem początkującym użytkownikiem numpy i próbuję wyodrębnić niektóre dane z długiej tablicy numpy. Muszę zacząć od zdefiniowanej pozycji w mojej tablicy, a następnie podpróbkować każdy n-ty punkt danych z tej pozycji, aż do końca mojej tablicy.

w zasadzie gdybym miał

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

Chcę rozpocząć podpróbkowanie, a[1]a następnie próbkować co czwarty punkt, aby uzyskać coś podobnego

b = [2,2,2.....]
Rich Williams
źródło

Odpowiedzi:

162

Możesz po prostu użyć plastrowania Numpy'sstart:stop:step .

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

Tworzy to widok oryginalnych danych, więc jest to stały czas . Odzwierciedla również zmiany w oryginalnej tablicy i zachowuje całą oryginalną tablicę w pamięci:

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

więc jeśli któraś z powyższych rzeczy stanowi problem, możesz jawnie utworzyć kopię:

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

Nie jest to stały czas, ale wynik nie jest powiązany z oryginalną tablicą. Kopia jest również ciągła w pamięci, co może przyspieszyć niektóre operacje na niej.

behzad.nouri
źródło
1
dziękuję za ostrzeżenie o kopii referencyjnej / wartości. w przeciwnym razie zdecydowanie wpadłbym w pułapkę
wiecznie