인덱싱과 슬라이싱은 데이터가 저장된 구조를 이해한 상태에서 숫자를 자유자재로 이용해야 하니 상당히 헷갈리면서도 머리 아프다. 반복 숙달밖에 답이 없다.


1차원 배열

1차원은 리스트와 크게 다르지 않아 비교적 익숙하게 접근할 수 있다.

# 1차원 배열 인덱싱
arr = np.arange(1, 11)

print(arr[1], arr[3], arr[9])
print(arr[-1], arr[-5])

# 1차원 배열 슬라이싱
print(arr[2:7])     # 3 ~ 7
print(arr[::2])     # 홀수만
print(arr[4:])      # 5 ~ 10
print(arr[:7])      # 1 ~ 7
print(arr[::-1])    # 전체 역순

 


2차원 배열

# 2차원 배열 인덱싱
arr_2d = np.array([[10, 20, 30], [40, 50, 60]])

print(arr_2d)
print(arr_2d.shape)
print(arr_2d[0])
print(arr_2d[0][0], arr_2d[0, 1], arr_2d[(0, 2)])

print(arr[1][0])
print(arr[2][1])
print(arr[-1][-2])

다차원 배열의 인덱싱은 크게 [m][n], [m, n], (m, n) 세 가지가 있다.

하지만 맨 앞의 [m][n]은 조금 의미가 다른데, 특정 상황에서만 뒤의 두 방법과 동일하게 작동하는 문법이다.

슬라이싱을 해보면 바로 차이가 나타난다.

 

# 2차원 배열 슬라이싱
arr = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])

print(arr)
print(arr[:2, :2])
print(arr[:2][:2])

위와 같이 시도했을 때,

arr[:2, :2]

arr[:2][:2]

이 두 방식의 결과가 달라서 고민을 꽤 했다.


print(arr[:2, :2]) # [행 슬라이싱, 열 슬라이싱]

이 표현은 둘째 행까지 자르고, 둘째 열까지 자르는 동작을 동시에 한다.

그래서 9칸 중 4칸을 잘라낼 수 있다.


print(arr[:2][:2]) # 행을 잘라 새로운 행렬을 만들고, 거기서 다시 행을 잘라 새로운 행렬

이 표현은 arr[:2]를 진행한 새로운 행렬을 생성한 후, 뒤에 있는 [:2]를 적용한다.

원본에서 둘째 행까지 추출한 2 x 3 행렬이 된 상태에서 다시 둘째 행까지를 추출한다.

즉, [:m][:n][:k] ... 이 표현은 행만 자르는 작업을 반복하는 동작이다.


# 슬라이싱 = shape 유지 (차원 유지)
print(arr[:-1, :1], arr[:-1, :1].shape)

# index 접근 -> 값을 꺼내서 반환 (원본 차원 X)
print(arr[:-1, 0], arr[:-1, 0].shape)

슬라이싱은 그냥 원본 배열을 잘라낸 것이지 내용물을 건드린게 아니기에 차원이 유지된다.

반면 인덱싱은 배열에서 추출한 값으로 새로운 결과물을 반환하는 것이므로, 원본의 차원과 관련이 없게 된다.


팬시 인덱싱(Fancy indexing)

정수 배열을 위치 인자에 넣어 여러 인덱스를 추출하는 방법

# 1차원 배열 fancy indexing
arr = np.arange(5, 31, 5)
print(arr)
print(arr[[1, 3, 5]])

indices = [1, 3, 5]
print(arr[indices])    # == print(arr[[1, 3, 5]])

 

2차원 배열의 팬시 인덱싱은 주의할 필요가 있다.

# 2차원 배열 fancy indexing
arr = np.array([[5, 10, 15, 20], 
                [25, 30, 35, 40], 
                [45, 50, 55, 60]
                ])

# [10 35]
indices1 = [0, 1]
indices2 = [1, 2]
print(arr[indices1, indices2])
print(arr[[0, 1], [1, 2]])

# [25 55]
print(arr[[1, 2], [0, 2]])

25와 55를 추출하는 예제의 경우 혼동하기 쉬운 상황.

바깥의 콤마를 기준으로, 좌측 배열은 행을 가리키고 우측 배열은 열을 가리킨다.

위 코드는 1행 0열, 2행 2열에서 값을 가져온다는 뜻이다. 두 배열의 같은 인덱스끼리 짝을 지어주면 된다.

'Python' 카테고리의 다른 글

[DA] NumPy 입문  (0) 2025.09.08
[DA] 데이터 분석이란?  (0) 2025.09.08
[Python] Streamlit으로 페이지 만들어보기  (0) 2025.08.31
[Python] 모듈이란?  (0) 2025.08.26
[Python] 파이썬 가상환경 구축하기  (0) 2025.08.24

+ Recent posts