Python/Build setting

[Numpy]넘파이 indexing과 slicing의 차이

소소한 혜밍씨 2022. 8. 29. 10:16

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의 경우 차원 유지됨을 확인할 수 있다.