подвыборка каждой n-й записи в массиве numpy

96

Я новичок в numpy, и я пытаюсь извлечь некоторые данные из длинного массива numpy. Что мне нужно сделать, так это начать с определенной позиции в моем массиве, а затем выполнить подвыборку каждой n-й точки данных из этой позиции до конца моего массива.

в основном, если бы у меня было

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

Я хочу сделать подвыборку этого, чтобы начать с него, a[1]а затем отсчитывать каждую четвертую точку, чтобы получить что-то вроде

b = [2,2,2.....]
Рич Уильямс
источник

Ответы:

163

Вы можете использовать нарезку Numpy в просто 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])

Это не постоянное время, но результат не привязан к исходному массиву. Копия также является непрерывной в памяти, что может ускорить некоторые операции с ней.

behzad.nouri
источник
1
спасибо за предупреждение о копии ссылки / значения. В противном случае я бы определенно попал в ловушку
Forever