
NumPy는 Python에서 수치 계산을 빠르고 편리하게 하기 위한 라이브러리입니다.
데이터 분석, 인공지능, 머신러닝, 과학 계산에서 거의 필수적으로 사용됩니다. 특히 리스트(list)보다 훨씬 빠른 계산이 가능하다는 것이 가장 큰 장점입니다.
ndarray란 NumPy의 핵심 자료 구조로, n차원 배열을 의미한다. Python의 리스트와 유사하지만, 고정된 크기와 단일 데이터 타입을 가진다. 배열의 각 차원을 축(axis) 이라고 하며, 각 축의 크기는 배열의 모양(shape) 이다.
for문 없이 배열 전체를 한 번에 계산할 수 있다.
Python 리스트보다 훨씬 빠르게 연산을 수행한다.
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = a + b
print(c)
- 출력 결과: `array([5, 7, 9])`
합(sum), 평균(mean), 최대값(max), 최소값(min) 등 통계 함수를 제공한다.
선형대수, 행렬 연산, 푸리에 변환 등 다양한 수학 계산을 지원한다.
데이터를 연속된 메모리 공간에 저장하여 Python 리스트보다 메모리를 적게 사용한다.
대용량 데이터 처리에 적합하다.
| 항목 | Python 리스트 | NumPy 배열 |
|---|---|---|
| 속도 | 느림 | 빠름 |
| 메모리 사용 | 많음 | 적음 |
| 자료형 | 혼합 가능 | 동일한 자료형만 저장 |
| 연산 | 반복문(for) 필요 | 벡터화 연산 지원 |
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr)
[1 2 3 4]
np.zeros()) arr = np.zeros((2, 3)) # 2x3 배열
print(arr)
[[0. 0. 0.]
[0. 0. 0.]]
np.ones()) arr = np.ones((3, 2)) # 3x2 배열
print(arr)
[[1. 1.]
[1. 1.]
[1. 1.]]
np.arange()) arr = np.arange(0, 10, 2) # 0부터 9까지 2씩 증가하는 값
print(arr)
[0 2 4 6 8]
np.linspace()) arr = np.linspace(0, 1, 5) # 0에서 1까지 5개의 등간격 값
print(arr)
[0. 0.25 0.5 0.75 1. ]
np.random.randn()) arr = np.random.randn(2, 3) # 2x3 배열
print(arr)
[[-0.21923695 0.19261846 0.37270454]
[-1.27010038 -1.1695589 0.24189817]]
Python의 리스트처럼 ndarray도 인덱스를 사용하여 배열의 특정 값을 선택할 수 있다. NumPy 배열은 0부터 시작하는 인덱스를 사용하며, 다차원 배열에서도 각 차원별로 인덱스를 지정할 수 있다.
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[0]) # 0번째 요소 출력 (10)
print(arr[2]) # 2번째 요소 출력 (30)
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # 0번째 행, 1번째 열의 요소 출력 (2)
print(arr[2, 2]) # 2번째 행, 2번째 열의 요소 출력 (9)
arr = np.array([
[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]
])
print(arr[1, 0, 2]) # 1번째 차원, 0번째 행, 2번째 열의 요소 출력 (9)
Python 리스트의 슬라이싱과 유사하게 ndarray도
:를 사용하여 슬라이싱을 할 수 있다.
arr = np.array([10, 20, 30, 40, 50])
print(arr[1:4]) # 1번째 인덱스부터 3번째 인덱스까지의 값 출력 ([20, 30, 40])
print(arr[:3]) # 처음부터 2번째 인덱스까지 출력 ([10, 20, 30])
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[1:, :2]) # 1번째 행부터 끝까지, 0번째와 1번째 열만 출력 ([[4, 5], [7, 8]])
arr = np.array([
[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]
])
print(arr[:, 1, :2]) # 각 차원에서 1번째 행의 처음 두 열 출력 ([[4, 5], [10, 11]])
팬시 인덱싱을 통해 정수 배열을 사용하여 여러 위치의 값을 한 번에 선택할 수 있다.
arr = np.array([10, 20, 30, 40, 50])
idx = [0, 2, 4] # 0번째, 2번째, 4번째 인덱스를 선택
print(arr[idx]) # [10, 30, 50]
- 행과 열의 인덱스를 각각 배열로 지정하여 선택할 수 있다.
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
rows = [0, 1, 2]
cols = [2, 1, 0]
print(arr[rows, cols]) # 각 행과 열을 묶어서 [(0, 2), (1, 1), (2, 0)]
[3 5 7]
조건을 만족하는 배열의 요소를 선택하는 방법이다.
arr = np.array([10, 20, 30, 40, 50])
print(arr[arr > 30]) # [40, 50]
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[arr > 4]) # [5, 6, 7, 8, 9]
np.sort() 함수를 사용하여 수행된다. 이 함수는 배열의 복사본을 생성하여 정렬된 배열을 반환하며, 기본적으로 오름차순으로 정렬된다. import numpy as np
arr = np.array([30, 10, 20, 40, 50])
sorted_arr = np.sort(arr)
print(sorted_arr) # [10, 20, 30, 40, 50]
[::-1] 슬라이싱을 사용하여 내림차순으로 정렬할 수 있다. sorted_arr_desc = np.sort(arr)[::-1]
print(sorted_arr_desc) # [50, 40, 30, 20, 10]
arr2d = np.array([[5, 2, 3], [8, 4, 1]])
sorted_arr2d = np.sort(arr2d) # 행 단위로 정렬
print(sorted_arr2d)
# [[2, 3, 5],
# [1, 4, 8]]
arr2d = np.array([[5, 2, 3], [8, 4, 1]])
sorted_arr_axis0 = np.sort(arr2d, axis=0)
print(sorted_arr_axis0)
# [[5, 2, 1],
# [8, 4, 3]]
arr2d = np.array([[5, 2, 3], [8, 4, 1]])
sorted_arr_axis1 = np.sort(arr2d, axis=1)
print(sorted_arr_axis1)
# [[2, 3, 5],
# [1, 4, 8]]
- np.argsort() 함수는 배열을 정렬한 결과의 인덱스 배열을 반환한다. 이 인덱스를 사용하여 배열을 정렬할 수 있다.
arr = np.array([30, 10, 20])
sorted_indices = np.argsort(arr)
print(sorted_indices) # [1, 2, 0] (정렬된 순서의 인덱스)
# 인덱스를 사용하여 배열을 정렬
print(arr[sorted_indices]) # [10, 20, 30]
arr2d = np.array([[3, 1, 2], [6, 4, 5]])
sorted_indices = np.argsort(arr2d, axis=1) # 각 행을 기준으로 인덱스를 반환
print(sorted_indices)
# [[1, 2, 0],
# [1, 2, 0]]
배열 병합은 여러 개의 배열을 연결하여 하나의 배열로 만드는 방법이다. NumPy에서 배열을 병합하는 방법은 np.concatenate(), np.vstack(), np.hstack() 등의 함수를 사용한다.
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
merged_arr = np.concatenate((arr1, arr2))
print(merged_arr) # [1, 2, 3, 4, 5, 6]
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
merged_arr = np.concatenate((arr1, arr2), axis=0)
print(merged_arr)
# [[1, 2],
# [3, 4],
# [5, 6],
# [7, 8]]
merged_arr = np.concatenate((arr1, arr2), axis=1)
print(merged_arr)
# [[1, 2, 5, 6],
# [3, 4, 7, 8]]
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
merged_arr = np.vstack((arr1, arr2))
print(merged_arr)
# [[1, 2, 3],
# [4, 5, 6]]
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
merged_arr = np.hstack((arr1, arr2))
print(merged_arr) # [1, 2, 3, 4, 5, 6]
arr = np.array([10, 20, 30, 40])
print(np.mean(arr)) # 25.0print(np.median(arr)) # 25.0scipy.stats 패키지를 이용해 계산할 수 있다.from scipy import stats
arr = np.array([10, 20, 20, 30, 40])
print(stats.mode(arr)) # Mode: 20print(np.var(arr)) # 125.0print(np.std(arr)) # 11.1803print(np.max(arr) - np.min(arr)) # 30