[Numpy]넘파이 indexing과 slicing의 차이
indexing과 slicing은 numpy를 활용하여 원하는 값을 호출한다는 개념은 동일하다.
indexing과 slicing의 기본 문법
a = np.arange(10)
# indexing
print(a[5])
# slicing
print(a[5:8])
# 출력
5
[5 6 7]
생성된 numpy array 내에 원하는 배열을 추출하기 위해서
indexing은 배열의 index 상 숫자를 넣고 원하는 값을 추출한다.
slicing은 콜론 ( : )을 사용해서 [a:b] 내에 a와 b에 원하는 인덱스를 적용하고 a 이상, b미만의 인덱스에 해당하는 값을 추출한다.
그렇다면 이 둘의 차이점은 불러오는 코드만일까.
그건 아니다.
위 코드의 출력결과를 보면,
indexing을 사용하면 불러온 결과는 기존 1차원에서 0차원으로 차원이 감소한 것을 볼 수 있다.
반면에 slicing을 사용하면 차원이 유지된다.
코드를 직접 적용해 확인해보자.
b = np.arange(1, 13)
print(b)
print(b.shape)
print(b.ndim)
#출력
[ 1 2 3 4 5 6 7 8 9 10 11 12]
(12,)
1
이렇게 1부터 12까지 만들어진 배열 b가 있다.
이 배열 b 를 indexing과 slicing을 각각 적용하여 동일한 값을 출력하고자 한다.
# indexing
indexing = b[1]
# slicing
slicing = b[1:2]
print(indexing, indexing.shape, indexing.ndim)
print(slicing, slicing.shape, slicing.ndim)
# 출력
2 () 0
[2] (1,) 1
위와 같이 동일한 숫자를 뽑아왔음에도 shape을 확인해보면
indexing은 ( )형태의 0차원 즉, 스칼라형태인 반면,
slicing은 (1, )의 1차원 형태임을 확인 할 수 있다.
이러한 경우는 indexing과 slicing을 함께 사용할 때도 마찬가지이다.
먼저, reshape을 이용해서 위에서 사용한 b의 숫자 배열을 변경하고 그 출력 결과를 확인하자.
b = b.reshape(3, 4)
print(b)
print(b.shape)
print(b.ndim)
# 출력
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
(3, 4)
2
기존 1차원의 배열 b를 3행 4열의 2차원 형태로 reshape 시킨 결과이다.
이 결과를 이용해서 indexing과 slicing이 어떻게 차원이 감소하는지 혹은 유지되는지 확인해보자.
# indexing
row_r1 = b[1, :]
# slicing
row_r2 = b[1:2, :]
print(row_r1, row_r1.shape, row_r1.ndim)
print(row_r2, row_r2.shape, row_r2.ndim)
# 출력
[5 6 7 8] (4,) 1
[[5 6 7 8]] (1, 4) 2
동일한 구간을 불러왔음에도 indexing의 경우 2차원에서 1차원으로 감소, slicing의 경우 차원 유지됨을 확인할 수 있다.