Ответ 1
Вы можете использовать numpy slicing, просто start:stop:step
.
>>> xs
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
>>> xs[1::4]
array([2, 2, 2])
Это создает представление исходных данных, поэтому это постоянное время. Он также будет отражать изменения исходного массива и сохранить весь исходный массив в памяти:
>>> 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])
поэтому, если одна из перечисленных выше проблем является проблемой, вы можете сделать копию явно:
>>> 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])
Это не постоянное время, но результат не привязан к исходному массиву. Копия также смежна в памяти, что может сделать некоторые операции над ней быстрее.