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 |