Python NumPy

NumPy 배열의 인덱싱 이해하기

PyExplorer 2025. 1. 22. 09:00
728x90

NumPy 배열의 인덱싱 이해하기

NumPy는 Python에서 강력한 수치 계산 기능을 제공하는 라이브러리로, 데이터 분석과 과학 계산에서 매우 유용하게 사용됩니다. 오늘은 NumPy에서 1차원, 2차원, 다차원 배열의 인덱싱에 대해 자세히 알아보겠습니다. 각각의 경우를 이해하기 위해 실습 예제도 함께 제공하니, 코드를 직접 실행하며 학습해 보세요.

1. 1차원 배열의 인덱싱

1차원 배열은 Python의 리스트와 유사한 구조를 가지고 있습니다. 배열의 각 요소는 인덱스를 사용하여 접근할 수 있습니다.

1.1 기본 인덱싱

import numpy as np

# 1차원 배열 생성
arr = np.array([10, 20, 30, 40, 50])

# 특정 요소에 접근
print(arr[0])  # 출력: 10
print(arr[3])  # 출력: 40

1.2 음수 인덱싱

음수 인덱스를 사용하면 배열의 끝에서부터 요소를 선택할 수 있습니다.

# 음수 인덱싱 예제
print(arr[-1])  # 출력: 50
print(arr[-3])  # 출력: 30

1.3 슬라이싱

슬라이싱은 배열의 부분 집합을 선택하는 데 사용됩니다.

# 슬라이싱 예제
print(arr[1:4])  # 출력: [20 30 40]
print(arr[:3])   # 출력: [10 20 30]
print(arr[2:])   # 출력: [30 40 50]

1.4 조건부 인덱싱

조건을 사용하여 특정 조건을 만족하는 요소를 선택할 수 있습니다.

# 조건부 인덱싱 예제
print(arr[arr > 25])  # 출력: [30 40 50]

2. 2차원 배열의 인덱싱

2차원 배열은 행(row)과 열(column)의 구조를 가지며, 요소에 접근할 때는 두 개의 인덱스를 사용합니다.

2.1 기본 인덱싱

# 2차원 배열 생성
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 특정 요소에 접근
print(matrix[0, 0])  # 출력: 1 (첫 번째 행, 첫 번째 열)
print(matrix[2, 1])  # 출력: 8 (세 번째 행, 두 번째 열)

2.2 슬라이싱

2차원 배열에서 슬라이싱을 사용하면 특정 부분을 선택할 수 있습니다.

# 행 슬라이싱
print(matrix[1, :])  # 출력: [4 5 6] (두 번째 행 전체)

# 열 슬라이싱
print(matrix[:, 1])  # 출력: [2 5 8] (두 번째 열 전체)

# 부분 슬라이싱
print(matrix[0:2, 1:3])  # 출력: [[2 3]
                        #        [5 6]]

2.3 팬시 인덱싱 (Fancy Indexing)

팬시 인덱싱은 특정 행이나 열의 집합을 선택할 때 사용됩니다.

# 특정 행 선택
print(matrix[[0, 2], :])  # 출력: [[1 2 3]
                         #        [7 8 9]]

# 특정 열 선택
print(matrix[:, [0, 2]])  # 출력: [[1 3]
                         #        [4 6]
                         #        [7 9]]

3. 다차원 배열의 인덱싱

다차원 배열은 N차원의 데이터를 다룰 때 유용하며, 각 차원에 대해 인덱스를 지정하여 요소에 접근할 수 있습니다.

3.1 기본 인덱싱

# 3차원 배열 생성
tensor = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

# 특정 요소에 접근
print(tensor[0, 1, 1])  # 출력: 4 (첫 번째 블록, 두 번째 행, 두 번째 열)
print(tensor[1, 0, 0])  # 출력: 5 (두 번째 블록, 첫 번째 행, 첫 번째 열)

3.2 슬라이싱

다차원 배열에서도 슬라이싱을 사용하여 부분 배열을 선택할 수 있습니다.

# 특정 블록 선택
print(tensor[0, :, :])  # 출력: [[1 2]
                       #        [3 4]]

# 특정 행 선택
print(tensor[:, 1, :])  # 출력: [[3 4]
                        #        [7 8]]

# 특정 요소 집합 선택
print(tensor[:, :, 1])  # 출력: [[2 4]
                        #        [6 8]]

3.3 팬시 인덱싱

팬시 인덱싱은 다차원 배열에서도 적용 가능합니다.

# 특정 블록과 행 선택
print(tensor[[0, 1], [1, 0], :])  # 출력: [[3 4]
                                 #        [5 6]]

4. NumPy 인덱싱 주의사항

  1. 인덱스 범위 초과: 배열의 인덱스가 범위를 초과하면 IndexError가 발생합니다.
  2. 복사와 뷰(View): 슬라이싱 결과는 원본 배열의 뷰(View)로 제공되며, 이를 수정하면 원본 배열도 변경됩니다.
# 슬라이싱의 뷰(View) 동작
subset = arr[1:4]
subset[0] = 99
print(arr)  # 출력: [10 99 30 40 50]
  1. 데이터 타입: 배열의 데이터 타입은 동일해야 하므로, 다른 타입의 데이터를 인덱싱 결과에 대입하면 자동으로 변환됩니다.
# 데이터 타입 자동 변환
arr[0] = 3.14
print(arr)  # 출력: [ 3 99 30 40 50] (실수값이 정수로 변환됨)

마치며

NumPy 배열의 인덱싱은 데이터 분석과 과학 계산에서 매우 중요한 기능입니다. 1차원, 2차원, 다차원 배열의 인덱싱 방법을 이해하고 활용하면, 복잡한 데이터도 효율적으로 처리할 수 있습니다.

이 포스팅에서 소개한 내용을 바탕으로 NumPy의 다양한 인덱싱 기능을 연습해 보세요.

728x90