4일차) 넘파이 (4)

BinBin·2022년 1월 4일
1

머신러닝 공부

목록 보기
6/10
post-thumbnail

이전 포스팅에서는 특정한 데이터 하나를 지정하는 인덱싱에 대해서 공부했는데
오늘은 일정 범위의 데이터를 고르는 슬라이싱에 대해 공부해보도록 하겠습니다.

1차원 Slicing

저희가 인덱싱을 할 때에는 그냥 [ ]사이에다가 원하는 위치를 기입을 했었습니다.
다만 슬라이싱을 해야할 경우에는 범위를 지정해주어야 합니다.

이때 어떤 기호를 이용해서 범위를 지정해주어야 할까요?
1 ~ 10? 아니면 1 to 10?

정답은 바로 콜론( : )입니다.

원하는 숫자의 범위 사이에 콜론을 적어서 범위를 표시하는데 예시를 보도록 하겠습니다.

import numpy as np

array = np.arange(start=1, stop=11)

print(array[0:4])
[1, 2, 3, 4]

이렇게 슬라이싱을 하는데 특이한 점이라면 분명 0번째에서 4번째 까지 범위를 지정했는데
그러면 [1, 2, 3, 4, 5]가 나와야 하지 않느냐 라는 의문을 가지실 수 있는데
슬라이싱도 위 코드의 arange의 파라미터인 stop처럼 범위 끝부분보다 1작은 숫자까지만을 범위로 인식합니다.

따라서 코드상으로는 0부터 4까지지만 실제 출력은 0부터 3까지만 반환이 됩니다.

또다른 슬라이싱의 특징은 콜론 앞 뒤로 숫자를 적지 않으면 각각 처음부터 반환하고 끝까지 반환합니다.

array = np.arange(start=1, stop=11)

print(array[:4])
print(array[1:])
print(array[:])
[1 2 3 4]
[2 3 4 5 6 7 8 9 10]
[1 2 3 4 5 6 7 8 9 10]

만약 끝까지나 처음부터 반환을 해야하면 굳이 숫자를 적지 않고도 시작과 끝부분만 지정해 놓으면 간편하게 반환할 수 있습니다.

ndarray 슬라이싱의 특징!
슬라이싱을 한 결과값의 데이터 타입도 똑같이 ndarray로 인식이 됩니다!

다차원 Slicing

다차원 슬라이싱도 인덱싱과 비슷한 매커니즘으로 진행이 됩니다.
똑같이 [ ] 속에 row와 col순으로 슬라이싱할 범위를 지정해주시면 됩니다.

먼저 예시를 위해 3 X 3짜리 ndarray를 생성해서 슬라이싱을 해보도록 하겠습니다.

array = np.arange(start = 1, stop = 10)
array3 = array.reshape(3, 3)
print(array3)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
print(array3[0:2, 0:2])
print(array3[1:3, :3])
print(array3[:, :])
[[1 2]
 [4 5]]
 
[[4 5 6]
 [7 8 9]]
 
[[1 2 3]
 [4 5 6]
 [7 8 9]]

이런 식으로 1차원 슬라이싱과 똑같은 방식으로 값이 반환이 됩니다.

그런데 만약 2차원 ndarray에서 row와 col의 범위를 모두 지정해주지 않고 인덱싱처럼 한 부분만 선택하면 어떻게 될까요?

print(array3[0])

이 코드를 보고 한 번 생각해 보시길 바랍니다.

정답은 row가 인덱싱 됩니다.

왜냐하면 2차원 ndarray에서 axis 0과 1 둘 다 선택한 것이 아닌 axis 0 즉 row만 선택했기 때문에

따라서 위 코드를 실행하면 [1 2 3]이 출력이 됩니다.

profile
빅데이터에 관심이 많은 대학생입니다

0개의 댓글