1. NumPy ๊ธฐ์ด
1. NumPy ๊ธฐ์ด¶
๊ฐ์¶
NumPy(Numerical Python)๋ Python์์ ์์น ๊ณ์ฐ์ ์ํ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ค์ฐจ์ ๋ฐฐ์ด ๊ฐ์ฒด์ ๋ฐฐ์ด ์ฐ์ฐ์ ์ํ ๋ค์ํ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. NumPy ๋ฐฐ์ด ์์ฑ¶
1.1 ๊ธฐ๋ณธ ๋ฐฐ์ด ์์ฑ¶
import numpy as np
# ๋ฆฌ์คํธ๋ก๋ถํฐ ๋ฐฐ์ด ์์ฑ
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # [1 2 3 4 5]
print(type(arr1)) # <class 'numpy.ndarray'>
# 2์ฐจ์ ๋ฐฐ์ด
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# [[1 2 3]
# [4 5 6]]
# 3์ฐจ์ ๋ฐฐ์ด
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3.shape) # (2, 2, 2)
1.2 ํน์ ๋ฐฐ์ด ์์ฑ¶
# 0์ผ๋ก ์ฑ์์ง ๋ฐฐ์ด
zeros = np.zeros((3, 4))
print(zeros)
# 1๋ก ์ฑ์์ง ๋ฐฐ์ด
ones = np.ones((2, 3))
print(ones)
# ํน์ ๊ฐ์ผ๋ก ์ฑ์์ง ๋ฐฐ์ด
full = np.full((2, 2), 7)
print(full) # [[7 7], [7 7]]
# ๋จ์ ํ๋ ฌ
eye = np.eye(3)
print(eye)
# ๋น ๋ฐฐ์ด (์ด๊ธฐํ๋์ง ์์ ๊ฐ)
empty = np.empty((2, 3))
1.3 ์์ฐจ์ ๋ฐฐ์ด ์์ฑ¶
# arange: ๋ฒ์ ์ง์
arr = np.arange(0, 10, 2) # 0๋ถํฐ 10 ๋ฏธ๋ง, 2์ฉ ์ฆ๊ฐ
print(arr) # [0 2 4 6 8]
# linspace: ๋ฑ๊ฐ๊ฒฉ ๋ถํ
arr = np.linspace(0, 1, 5) # 0๋ถํฐ 1๊น์ง 5๊ฐ๋ก ๊ท ๋ฑ ๋ถํ
print(arr) # [0. 0.25 0.5 0.75 1. ]
# logspace: ๋ก๊ทธ ์ค์ผ์ผ ๋ฑ๊ฐ๊ฒฉ
arr = np.logspace(0, 2, 5) # 10^0 ๋ถํฐ 10^2 ๊น์ง
print(arr) # [ 1. 3.16 10. 31.62 100. ]
2. ๋ฐฐ์ด ์์ฑ¶
arr = np.array([[1, 2, 3], [4, 5, 6]])
# ์ฐจ์ ์
print(arr.ndim) # 2
# ํํ (shape)
print(arr.shape) # (2, 3)
# ์ ์ฒด ์์ ๊ฐ์
print(arr.size) # 6
# ๋ฐ์ดํฐ ํ์
print(arr.dtype) # int64
# ์์๋น ๋ฐ์ดํธ ์
print(arr.itemsize) # 8
# ์ ์ฒด ๋ฐ์ดํธ ์
print(arr.nbytes) # 48
๋ฐ์ดํฐ ํ์ ์ง์ ¶
# ์ ์
arr_int = np.array([1, 2, 3], dtype=np.int32)
# ์ค์
arr_float = np.array([1, 2, 3], dtype=np.float64)
# ๋ณต์์
arr_complex = np.array([1, 2, 3], dtype=np.complex128)
# ๋ถ๋ฆฌ์ธ
arr_bool = np.array([0, 1, 0, 1], dtype=np.bool_)
# ํ์
๋ณํ
arr = np.array([1.5, 2.7, 3.9])
arr_int = arr.astype(np.int32) # [1, 2, 3]
3. ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ¶
3.1 ๊ธฐ๋ณธ ์ธ๋ฑ์ฑ¶
arr = np.array([10, 20, 30, 40, 50])
# ๋จ์ผ ์์ ์ ๊ทผ
print(arr[0]) # 10
print(arr[-1]) # 50
# 2์ฐจ์ ๋ฐฐ์ด
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[0, 0]) # 1
print(arr2d[1, 2]) # 6
print(arr2d[-1, -1]) # 9
3.2 ์ฌ๋ผ์ด์ฑ¶
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# ๊ธฐ๋ณธ ์ฌ๋ผ์ด์ฑ [start:stop:step]
print(arr[2:7]) # [2 3 4 5 6]
print(arr[::2]) # [0 2 4 6 8]
print(arr[::-1]) # [9 8 7 6 5 4 3 2 1 0]
# 2์ฐจ์ ์ฌ๋ผ์ด์ฑ
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[0:2, 1:3])
# [[2 3]
# [5 6]]
print(arr2d[:, 0]) # ์ฒซ ๋ฒ์งธ ์ด: [1 4 7]
print(arr2d[1, :]) # ๋ ๋ฒ์งธ ํ: [4 5 6]
3.3 ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ¶
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ ์ ํ
mask = arr > 5
print(mask) # [False False False False False True True True True True]
print(arr[mask]) # [ 6 7 8 9 10]
# ์ง์ ์กฐ๊ฑด ์ฌ์ฉ
print(arr[arr > 5]) # [ 6 7 8 9 10]
print(arr[arr % 2 == 0]) # [ 2 4 6 8 10]
# ๋ณตํฉ ์กฐ๊ฑด
print(arr[(arr > 3) & (arr < 8)]) # [4 5 6 7]
print(arr[(arr < 3) | (arr > 8)]) # [ 1 2 9 10]
3.4 ํฌ์ ์ธ๋ฑ์ฑ¶
arr = np.array([10, 20, 30, 40, 50])
# ์ธ๋ฑ์ค ๋ฐฐ์ด๋ก ์ ๊ทผ
indices = [0, 2, 4]
print(arr[indices]) # [10 30 50]
# 2์ฐจ์ ๋ฐฐ์ด
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# ํน์ ํ ์ ํ
print(arr2d[[0, 2]])
# [[1 2 3]
# [7 8 9]]
# ํน์ ์์ ์ ํ
rows = [0, 1, 2]
cols = [0, 1, 2]
print(arr2d[rows, cols]) # [1 5 9] (๋๊ฐ์ ์์)
4. ๋ฐฐ์ด ํํ ๋ณํ¶
4.1 reshape¶
arr = np.arange(12)
print(arr) # [ 0 1 2 3 4 5 6 7 8 9 10 11]
# 2์ฐจ์์ผ๋ก ๋ณํ
arr2d = arr.reshape(3, 4)
print(arr2d)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# -1 ์ฌ์ฉ: ์๋ ๊ณ์ฐ
arr2d = arr.reshape(4, -1) # 4ํ, ์ด ์๋ ๊ณ์ฐ
print(arr2d.shape) # (4, 3)
arr2d = arr.reshape(-1, 6) # ํ ์๋ ๊ณ์ฐ, 6์ด
print(arr2d.shape) # (2, 6)
4.2 flatten๊ณผ ravel¶
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
# flatten: ๋ณต์ฌ๋ณธ ์์ฑ
flat = arr2d.flatten()
print(flat) # [1 2 3 4 5 6]
# ravel: ๋ทฐ(view) ์์ฑ (์๋ณธ ๊ณต์ )
rav = arr2d.ravel()
print(rav) # [1 2 3 4 5 6]
4.3 ์ ์น (Transpose)¶
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # (2, 3)
# ์ ์น
transposed = arr.T
print(transposed)
# [[1 4]
# [2 5]
# [3 6]]
print(transposed.shape) # (3, 2)
# ๋ค์ฐจ์ ์ ์น
arr3d = np.arange(24).reshape(2, 3, 4)
print(arr3d.transpose(1, 0, 2).shape) # (3, 2, 4)
4.4 ์ฐจ์ ์ถ๊ฐ/์ ๊ฑฐ¶
arr = np.array([1, 2, 3])
print(arr.shape) # (3,)
# ์ฐจ์ ์ถ๊ฐ
arr_2d = arr[np.newaxis, :] # ๋๋ arr.reshape(1, -1)
print(arr_2d.shape) # (1, 3)
arr_col = arr[:, np.newaxis] # ๋๋ arr.reshape(-1, 1)
print(arr_col.shape) # (3, 1)
# expand_dims ์ฌ์ฉ
arr_exp = np.expand_dims(arr, axis=0)
print(arr_exp.shape) # (1, 3)
# squeeze: ํฌ๊ธฐ 1์ธ ์ฐจ์ ์ ๊ฑฐ
arr = np.array([[[1, 2, 3]]])
print(arr.shape) # (1, 1, 3)
print(np.squeeze(arr).shape) # (3,)
5. ๋ฐฐ์ด ์ฐ์ฐ¶
5.1 ๊ธฐ๋ณธ ์ฐ์ ์ฐ์ฐ¶
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
# ์์๋ณ ์ฐ์ฐ
print(a + b) # [11 22 33 44]
print(a - b) # [ -9 -18 -27 -36]
print(a * b) # [ 10 40 90 160]
print(a / b) # [0.1 0.1 0.1 0.1]
print(a ** 2) # [ 1 4 9 16]
print(a % 2) # [1 0 1 0]
print(a // 2) # [0 1 1 2]
# ์ค์นผ๋ผ ์ฐ์ฐ
print(a + 10) # [11 12 13 14]
print(a * 2) # [2 4 6 8]
5.2 ์ ๋๋ฒ์ค ํจ์ (ufuncs)¶
arr = np.array([1, 4, 9, 16, 25])
# ์ํ ํจ์
print(np.sqrt(arr)) # [1. 2. 3. 4. 5.]
print(np.exp(arr)) # ์ง์ ํจ์
print(np.log(arr)) # ์์ฐ๋ก๊ทธ
print(np.log10(arr)) # ์์ฉ๋ก๊ทธ
# ์ผ๊ฐ ํจ์
angles = np.array([0, np.pi/6, np.pi/4, np.pi/3, np.pi/2])
print(np.sin(angles))
print(np.cos(angles))
print(np.tan(angles))
# ๋ฐ์ฌ๋ฆผ
arr = np.array([1.2, 2.5, 3.7, 4.4])
print(np.round(arr)) # [1. 2. 4. 4.]
print(np.floor(arr)) # [1. 2. 3. 4.]
print(np.ceil(arr)) # [2. 3. 4. 5.]
print(np.trunc(arr)) # [1. 2. 3. 4.]
# ์ ๋๊ฐ
arr = np.array([-1, -2, 3, -4])
print(np.abs(arr)) # [1 2 3 4]
5.3 ์ง๊ณ ํจ์¶
arr = np.array([[1, 2, 3], [4, 5, 6]])
# ์ ์ฒด ์ง๊ณ
print(np.sum(arr)) # 21
print(np.mean(arr)) # 3.5
print(np.std(arr)) # 1.707...
print(np.var(arr)) # 2.916...
print(np.min(arr)) # 1
print(np.max(arr)) # 6
print(np.prod(arr)) # 720 (๋ชจ๋ ์์์ ๊ณฑ)
# ์ถ ๊ธฐ์ค ์ง๊ณ
print(np.sum(arr, axis=0)) # ์ด ํฉ๊ณ: [5 7 9]
print(np.sum(arr, axis=1)) # ํ ํฉ๊ณ: [6 15]
print(np.mean(arr, axis=0)) # ์ด ํ๊ท : [2.5 3.5 4.5]
print(np.mean(arr, axis=1)) # ํ ํ๊ท : [2. 5.]
# ๋์ ํฉ/๊ณฑ
print(np.cumsum(arr)) # [ 1 3 6 10 15 21]
print(np.cumprod(arr)) # [ 1 2 6 24 120 720]
# ์ธ๋ฑ์ค ๋ฐํ
print(np.argmin(arr)) # 0 (์ต์๊ฐ์ ์ธ๋ฑ์ค)
print(np.argmax(arr)) # 5 (์ต๋๊ฐ์ ์ธ๋ฑ์ค)
6. ๋ธ๋ก๋์บ์คํ ¶
๋ธ๋ก๋์บ์คํ ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ฐฐ์ด ๊ฐ์ ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ NumPy์ ํต์ฌ ๊ธฐ๋ฅ์ ๋๋ค.
6.1 ๋ธ๋ก๋์บ์คํ ๊ท์น¶
- ๋ ๋ฐฐ์ด์ ์ฐจ์ ์๊ฐ ๋ค๋ฅด๋ฉด, ์์ ๋ฐฐ์ด์ shape ์์ 1์ ์ถ๊ฐ
- ๊ฐ ์ฐจ์์์ ํฌ๊ธฐ๊ฐ 1์ธ ๋ฐฐ์ด์ ๋ค๋ฅธ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ๋ง์ถฐ ํ์ฅ
- ํฌ๊ธฐ๊ฐ 1์ด ์๋๊ณ ์๋ก ๋ค๋ฅด๋ฉด ์ค๋ฅ ๋ฐ์
# ์ค์นผ๋ผ์ ๋ฐฐ์ด
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr + 10)
# [[11 12 13]
# [14 15 16]]
# 1์ฐจ์๊ณผ 2์ฐจ์
arr = np.array([[1, 2, 3], [4, 5, 6]])
row = np.array([10, 20, 30])
print(arr + row)
# [[11 22 33]
# [14 25 36]]
# ์ด ๋ฒกํฐ์ 2์ฐจ์
col = np.array([[100], [200]])
print(arr + col)
# [[101 102 103]
# [204 205 206]]
6.2 ๋ธ๋ก๋์บ์คํ ์์ ¶
# ํ์คํ (standardization)
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mean = np.mean(data, axis=0) # [4. 5. 6.]
std = np.std(data, axis=0) # [2.449 2.449 2.449]
standardized = (data - mean) / std
# ๊ฑฐ๋ฆฌ ๊ณ์ฐ
point = np.array([1, 2])
points = np.array([[0, 0], [1, 1], [2, 2], [3, 3]])
distances = np.sqrt(np.sum((points - point) ** 2, axis=1))
print(distances) # [2.236 1. 1.414 2.236]
7. ๋ฐฐ์ด ๊ฒฐํฉ๊ณผ ๋ถํ ¶
7.1 ๋ฐฐ์ด ๊ฒฐํฉ¶
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# ์์ง ๊ฒฐํฉ (ํ ๋ฐฉํฅ)
v_stack = np.vstack([a, b])
print(v_stack)
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
# ์ํ ๊ฒฐํฉ (์ด ๋ฐฉํฅ)
h_stack = np.hstack([a, b])
print(h_stack)
# [[1 2 5 6]
# [3 4 7 8]]
# concatenate ์ฌ์ฉ
concat_v = np.concatenate([a, b], axis=0) # vstack๊ณผ ๋์ผ
concat_h = np.concatenate([a, b], axis=1) # hstack๊ณผ ๋์ผ
# ๊น์ด ๋ฐฉํฅ ๊ฒฐํฉ
d_stack = np.dstack([a, b])
print(d_stack.shape) # (2, 2, 2)
7.2 ๋ฐฐ์ด ๋ถํ ¶
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# ์์ง ๋ถํ
v_split = np.vsplit(arr, 3) # 3๊ฐ๋ก ๋ถํ
print(len(v_split)) # 3
# ์ํ ๋ถํ
h_split = np.hsplit(arr, 2) # 2๊ฐ๋ก ๋ถํ
print(h_split[0])
# [[ 1 2]
# [ 5 6]
# [ 9 10]]
# split ์ฌ์ฉ
split_arr = np.split(arr, [1, 2], axis=0) # ์ธ๋ฑ์ค 1, 2์์ ๋ถํ
print(len(split_arr)) # 3
8. ๋ณต์ฌ์ ๋ทฐ¶
8.1 ๋ทฐ (View) - ์์ ๋ณต์ฌ¶
arr = np.array([1, 2, 3, 4, 5])
# ์ฌ๋ผ์ด์ฑ์ ๋ทฐ๋ฅผ ์์ฑ
view = arr[1:4]
view[0] = 100
print(arr) # [ 1 100 3 4 5] # ์๋ณธ๋ ๋ณ๊ฒฝ๋จ
print(view) # [100 3 4]
8.2 ๋ณต์ฌ (Copy) - ๊น์ ๋ณต์ฌ¶
arr = np.array([1, 2, 3, 4, 5])
# ๋ช
์์ ๋ณต์ฌ
copy = arr.copy()
copy[0] = 100
print(arr) # [1 2 3 4 5] # ์๋ณธ ์ ์ง
print(copy) # [100 2 3 4 5]
์ฐ์ต ๋ฌธ์ ¶
๋ฌธ์ 1: ๋ฐฐ์ด ์์ฑ¶
1๋ถํฐ 100๊น์ง์ ์ ์ ์ค 3์ ๋ฐฐ์๋ง ํฌํจํ๋ ๋ฐฐ์ด์ ์์ฑํ์ธ์.
# ํ์ด
arr = np.arange(3, 101, 3)
# ๋๋
arr = np.arange(1, 101)
arr = arr[arr % 3 == 0]
๋ฌธ์ 2: ํ๋ ฌ ์ฐ์ฐ¶
3x3 ๋จ์ ํ๋ ฌ์ ๋๊ฐ์ ์์์ ํฉ์ ๊ตฌํ์ธ์.
# ํ์ด
eye = np.eye(3)
diagonal_sum = np.trace(eye) # 3.0
# ๋๋
diagonal_sum = np.sum(np.diag(eye))
๋ฌธ์ 3: ๋ธ๋ก๋์บ์คํ ¶
4x4 ํ๋ ฌ์์ ๊ฐ ์ด์ ์ต๋๊ฐ์ผ๋ก ์ ๊ทํํ์ธ์ (๊ฐ ์์๋ฅผ ํด๋น ์ด์ ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ).
# ํ์ด
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
col_max = np.max(arr, axis=0) # [13, 14, 15, 16]
normalized = arr / col_max
์์ฝ¶
| ๊ธฐ๋ฅ | ํจ์/๋ฉ์๋ |
|---|---|
| ๋ฐฐ์ด ์์ฑ | np.array(), np.zeros(), np.ones(), np.arange(), np.linspace() |
| ๋ฐฐ์ด ์์ฑ | shape, dtype, ndim, size |
| ์ธ๋ฑ์ฑ | arr[i], arr[i, j], arr[condition], arr[indices] |
| ํํ ๋ณํ | reshape(), flatten(), ravel(), T |
| ์ฐ์ฐ | +, -, *, /, np.sum(), np.mean(), np.std() |
| ๊ฒฐํฉ/๋ถํ | np.vstack(), np.hstack(), np.split() |