본문 바로가기

Python

[Python] Numpy 인덱싱, 슬라이싱

728x90

넘파이(NumPy) 인덱싱과 슬라이싱

NumPy 인덱싱(indexing)슬라이싱(slicing)은 배열에서 특정 요소나 부분 배열에 접근하기 위해 사용됩니다. 기본적으로 파이썬의 리스트와 유사하지만, 다차원 배열에서 효율적으로 사용할 수 있는 기능들을 제공합니다.

 

1. 넘파이 배열 생성

import numpy as np

a = np.arange(10) ** 2
print(a)
# 출력: [ 0  1  4  9 16 25 36 49 64 81]
  • np.arange(10)은 0부터 9까지 정수 배열을 생성합니다.
  • 각 요소를 제곱한 결과로 새로운 배열이 만들어집니다.

2. 넘파이 인덱싱 (Indexing)

인덱싱은 특정 위치의 요소를 선택할 때 사용됩니다.

print(a[2])  # 4
print(a[1])  # 1
print(a[5])  # 25
  • 0부터 시작하는 인덱스로 배열의 특정 요소에 접근합니다.

 

3. 넘파이 슬라이싱 (Slicing)

슬라이싱은 배열의 일부분을 잘라내어 새 배열로 반환합니다.

# 인덱스 2부터 4까지 출력 (5는 포함하지 않음)
print(a[2:5])  
# 결과: [ 4  9 16]

# 배열을 역순으로 출력
print(a[::-1])  
# 결과: [81 64 49 36 25 16  9  4  1  0]

# 0~8번 인덱스까지 3의 간격으로 출력
print(a[:9:3])  
# 결과: [ 0  9 36]

슬라이싱 구문: [start:end:step]

  • start: 시작 인덱스 (포함)
  • end: 끝 인덱스 (미포함)
  • step: 간격

 

슬라이싱으로 값 변경하기

a[:9:3] = -1
print(a)
# 결과: [-1  1  4 -1 16 25 -1 49 64 81]
  • 슬라이싱으로 선택한 범위에 값을 일괄 할당할 수 있습니다.

 

4. 배열을 활용한 인덱싱 (Fancy Indexing)

NumPy는 배열을 사용해 인덱스 위치를 지정하는 팬시 인덱싱을 지원합니다.

1차원 배열 인덱싱

a = np.arange(10) ** 2
i = np.array([1, 2, 5, 7])
print(a[i])  
# 결과: [ 1  4 25 49]

2차원 배열 인덱싱

i = np.array([[2, 3], [4, 5]])
print(a[i])
# 결과:
# [[ 4  9]
#  [16 25]]
  • 배열을 인덱스로 전달하면, 해당 위치의 값을 추출하여 새로운 배열을 만듭니다.

 

5. Boolean 인덱싱

Boolean 인덱싱은 조건에 맞는 요소들만 선택하는 방법입니다.

a = np.arange(12).reshape(3, 4)
b = a > 4
print(a[b])
# 결과: [ 5  6  7  8  9 10 11]
  • b는 조건을 만족하는 위치에 True 값을 갖는 Boolean 배열입니다.

짝수만 선택하기

b = a % 2 == 0
print(a[b])  
# 결과: [ 0  2  4  6  8 10]
print(b)
# 결과:
# [[ True False  True False]
#  [ True False  True False]
#  [ True False  True False]]

Boolean 인덱싱으로 값 변경하기

a[b] = -1
print(a)
# 결과:
# [[-1  1 -1  3]
#  [-1  5 -1  7]
#  [-1  9 -1 11]]
  • 조건을 만족하는 요소에 새로운 값을 할당합니다

 

6. 넘파이 배열의 크기 변경

NumPy 배열은 다양한 방식으로 크기나 형태를 변경할 수 있습니다.

a = np.arange(12).reshape(3, 4)
print(a)
# 결과:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

1차원으로 변경: .ravel()과 reshape(-1)

print(a.ravel())  
# 결과: [ 0  1  2  3  4  5  6  7  8  9 10 11]

print(a.reshape(-1))  
# 결과: [ 0  1  2  3  4  5  6  7  8  9 10 11]
  • ravel(): 배열을 1차원으로 변환하며 원본과 연결된 형태입니다.
  • reshape(-1): 크기에 맞게 배열을 자동으로 1차원으로 변환합니다.

다른 형태로 변경: reshape()

print(a.reshape(4, 3))
# 결과:
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]
  • reshape(): 원하는 차원으로 배열의 모양을 변경합니다.

전치(Transpose): .T

print(a.T)
# 결과:
# [[ 0  4  8]
#  [ 1  5  9]
#  [ 2  6 10]
#  [ 3  7 11]]
  • T: 행과 열을 바꿔 배열을 전치합니다.

 

 

7. 요약

  • 인덱싱(Indexing): 특정 위치의 요소에 접근.
  • 슬라이싱(Slicing): 배열의 일부분을 잘라내어 사용.
  • 배열 인덱싱: 배열을 이용해 여러 위치의 요소를 한 번에 선택.
  • Boolean 인덱싱: 조건에 맞는 요소를 선택.
  • 크기 변경: .reshape(), .ravel(), .T 등을 사용해 배열의 형태를 변경.

 

이처럼 NumPy의 인덱싱과 슬라이싱은 배열의 요소에 접근하고 조작하는 데 강력한 기능을 제공합니다. 이를 통해 데이터의 일부를 빠르게 추출하고 처리할 수 있으며, 다양한 크기 변경 옵션으로 효율적으로 배열을 다룰 수 있습니다.

728x90

'Python' 카테고리의 다른 글

[Python] Numpy 데이터 합치기, 쪼개기  (0) 2024.10.20
[Python] 넘파이(Numpy) 배열  (6) 2024.10.13
[Python] 리스트  (0) 2024.09.03
[Python] 함수  (0) 2024.08.27
[Python] 반복문  (0) 2024.08.27