저는 numpy 초보자이며 긴 numpy 배열에서 일부 데이터를 추출하려고합니다. 내가해야 할 일은 배열의 정의 된 위치에서 시작한 다음 배열이 끝날 때까지 해당 위치에서 n 번째 데이터 포인트마다 서브 샘플링하는 것입니다.
기본적으로 내가 가지고 있다면
a = [1,2,3,4,1,2,3,4,1,2,3,4....]
나는 이것을 서브 샘플링하여 시작하고 a[1]
거기에서 매 4 점마다 샘플링하여 다음과 같은 것을 생성하고 싶습니다.
b = [2,2,2.....]
답변
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])
이것은 일정한 시간이 아니지만 결과는 원래 배열에 연결되어 있지 않습니다. 복사본은 또한 메모리에서 연속적이므로 일부 작업을 더 빠르게 수행 할 수 있습니다.