안녕하세요~ 꽁냥이에요. 요즘 Numpy에 대한 글을 포스팅하고 있는데요.
이번에는 Numpy 배열 Slicing에 대해서 포스팅해보려고 합니다. 배열 Slicing은 배열에 포함된 원소 개별값 또는 부분 집합을 추출하는 뜻이에요. 여기에서는 1차원 배열에 대해서 중점적으로 다룹니다.
1. Index를 통한 Slicing
1.1 개별 원소 접근하기
Numpy 1차원 배열은 아래와 같이 각괄호 안에 인덱스 숫자를 넣어서 개별 원소에 접근할 수 있어요. 이때 인덱스의 범위는 0~배열 길이-1, 또는 -배열 길이~-1까지 입니다.
a = np.array([1,3,11,2])
a[3] ## index는 일반적으로 0~len(a)-1까지 또는 -1~-len(a) 값을 넣을 수 있다.
# 2
a[0]
# 1
a[len(a)-1]
# 8
a[-3]
# 3
'a'의 인덱스(빨간색)와 데이터 값(검정색)의 구조는 다음과 같아요.
만약 인덱스가 범위 밖으로 벗어난 경우 아래와 같이 index ~ is out of bounds for axis 0 with size ~ 메시지와 함께 IndexError를 발생시킵니다.
1.2 여러 원소 추출하기
- 연속적으로 나열된 원소 추출 -
Numpy에서는 콜론(:)을 이용하여 연속적으로 나열된 원소를 추출할 수 있습니다. 이때 인덱스 범위는 0~배열 길이, - 배열 길이~-1 까지 입니다. 개별 원소에 접근할 때와는 다르다는 점에 유의하세요~
아래 코드는 배열 a의 전체 원소를 추출하는 방법을 나타낸 것입니다(순서 유지). (사실 전체를 추출하기 위하여 Slice를 사용할 일은 없습니다 ㅎㅎ)
a = np.array([1,3,11,2])
a[0:4]
# array([ 1, 3, 11, 2])
a[-4:]
# array([ 1, 3, 11, 2])
a[:]
# array([ 1, 3, 11, 2])
이번엔 일부를 추출해보겠습니다.
a[1:3] ## 또는 a[-3:-1]
# array([ 3, 11])
아래 그림은 콜론을 사용할 경우의 인덱스 구조와 a[1:3]의 결과를 나타낸 것입니다.
- 특정 위치에 있는 원소 집합 추출 -
연속적으로 나열된 원소들 외에도 필요에 따라서 특정 인덱스에 있는 여러 원소들을 추출하고 싶을 때가 있을 거예요. 개별 원소를 접근할 때 인덱스 숫자만 썼던 것을 기억하시나요? 인덱스 숫자 대신 원하는 인덱스를 리스트로 만들어주면 됩니다.
아래 코드는 a 배열의 2번째 원소와 4번째 원소를 추출합니다.
a[[1,3]]
# array([3, 2])
2. 조건문을 통한 Slicing
Numpy 배열은 조건문을 이용해서 Slicing을 할 수 있는데요. 방법은 매우 쉽습니다.
b = np.array([1,1,3,5,6,11])
b[b>5] ## 5보다 큰 원소 추출
# array([ 6, 11])
b[b==1] ## 값이 1인 원소 추출
# array([1, 1])
만약 특정 조건을 만족하는 값이 아닌 인덱스를 추출하고 싶다면 where를 사용합니다.
np.where(b>5)[0]
# array([4, 5], dtype=int64)
np.where(b==1)[0]
#array([0, 1], dtype=int64)
이번 포스팅에서는 배열 Slicing을 알아보았습니다. 배열 Slicing은 특정 조건을 만족하는 데이터를 뽑거나 특정 데이터를 대체할 때 필요한 기술이므로 알아두시면 매우 유용해요. 여기에서는 1차원 배열에 대해서 다루었지만 2차원 배열에도 쉽게 적용할 수 있어요. 다음 포스팅에서는 배열 연산에 대해서 알아보겠습니다. 또 만나요~~
참고자료
Numpy Tutorial - https://numpy.org/doc/stable/user/absolute_beginners.html#indexing-and-slicing
댓글