KR_Numpy - somaz94/python-study GitHub Wiki
NumPy๋ ํ์ด์ฌ์์ ์์น ๊ณ์ฐ์ ์ํ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํจ์จ์ ์ธ ๋ฐฐ์ด ์ฒ๋ฆฌ์ ์ํ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
import numpy as np
# ๋ฐฐ์ด ์์ฑ
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.zeros((3, 3)) # 3x3 ์ํ๋ ฌ
arr3 = np.ones((2, 4)) # 2x4 1ํ๋ ฌ
arr4 = np.arange(0, 10, 2) # 0๋ถํฐ 10๊น์ง 2๊ฐ๊ฒฉ
arr5 = np.linspace(0, 1, 5) # 0๋ถํฐ 1๊น์ง 5๊ฐ ๊ท ๋ฑ ๋ถํ
# ๋ฐฐ์ด ์ ๋ณด ํ์ธ
print(f"๋ฐฐ์ด ํํ: {arr1.shape}")
print(f"๋ฐฐ์ด ์ฐจ์: {arr1.ndim}")
print(f"๋ฐฐ์ด ํ์
: {arr1.dtype}")
print(f"๋ฐฐ์ด ํฌ๊ธฐ: {arr1.size}")
# ํน์ ํ๋ ฌ
identity = np.eye(3) # 3x3 ๋จ์ํ๋ ฌ
random_arr = np.random.rand(2, 3) # 0~1 ์ฌ์ด ๋์ ํ๋ ฌ
โ
ํน์ง:
- ๋ค์ฐจ์ ๋ฐฐ์ด ์์ฑ
- ํน์ ํ๋ ฌ ์์ฑ
- ์์ด ์์ฑ
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ
- ๋ฒกํฐํ ์ฐ์ฐ
- ๋ค์ํ ๋ฐ์ดํฐ ํ์
NumPy๋ ๋ค์ํ ํ๋ ฌ ์ฐ์ฐ๊ณผ ์ ํ๋์ ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ์ ๊ณตํ๋ค.
# ํ๋ ฌ ์์ฑ
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# ๊ธฐ๋ณธ ํ๋ ฌ ์ฐ์ฐ
print(A + B) # ํ๋ ฌ ๋ง์
print(A - B) # ํ๋ ฌ ๋บ์
print(A.dot(B)) # ํ๋ ฌ ๊ณฑ์
(๋ด์ )
print(np.multiply(A, B)) # ์์๋ณ ๊ณฑ์
(์๋ค๋ง๋ฅด ๊ณฑ)
# ํ๋ ฌ ๋ณํ
print(A.T) # ์ ์นํ๋ ฌ
print(np.linalg.matrix_power(A, 2)) # ํ๋ ฌ ์ ๊ณฑ
# ์ ํ๋์ ์ฐ์ฐ
print(np.linalg.inv(A)) # ์ญํ๋ ฌ
print(np.linalg.det(A)) # ํ๋ ฌ์
eigenvals, eigenvecs = np.linalg.eig(A) # ๊ณ ์ ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ
print(f"๊ณ ์ ๊ฐ: {eigenvals}")
print(f"๊ณ ์ ๋ฒกํฐ: {eigenvecs}")
# ํ๋ ฌ ๋ถํด
U, s, Vh = np.linalg.svd(A) # ํน์ด๊ฐ ๋ถํด
print(f"U: {U}, s: {s}, Vh: {Vh}")
โ
ํน์ง:
- ๊ธฐ๋ณธ ํ๋ ฌ ์ฐ์ฐ
- ์ ํ๋์ ์ฐ์ฐ
- ํ๋ ฌ ๋ถํด
- ํจ์จ์ ์ธ ๊ณ์ฐ
- ์ํ์ ํจ์
- ๊ณ ๊ธ ์ ํ๋์ ๊ธฐ๋ฅ
NumPy ๋ฐฐ์ด์ ๊ฐ๋ ฅํ ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ ์ฐํ๊ฒ ํ๋ค.
# ๋ค์ฐจ์ ๋ฐฐ์ด ์์ฑ
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# ๊ธฐ๋ณธ ์ธ๋ฑ์ฑ
print(arr[0, 0]) # ์ฒซ ๋ฒ์งธ ์์
print(arr[1, 2]) # 2ํ 3์ด ์์
print(arr[-1, -1]) # ๋ง์ง๋ง ํ, ๋ง์ง๋ง ์ด
# ๊ธฐ๋ณธ ์ฌ๋ผ์ด์ฑ
print(arr[:2]) # ์ฒ์ ๋ ํ
print(arr[:, 1:3]) # ๋ชจ๋ ํ์ 2~3์ด
print(arr[1:, :2]) # 2ํ๋ถํฐ์ ์ฒ์ ๋ ์ด
# ๊ณ ๊ธ ์ธ๋ฑ์ฑ
indices = np.array([0, 2])
print(arr[indices]) # 1ํ๊ณผ 3ํ ์ ํ
# ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ
mask = arr > 5
print(arr[mask]) # 5๋ณด๋ค ํฐ ์์๋ค
# ํฌ์ ์ธ๋ฑ์ฑ
rows = np.array([0, 2])
cols = np.array([1, 3])
print(arr[rows[:, np.newaxis], cols]) # ๊ต์ฐจ ์ ํ
โ
ํน์ง:
- ๋ค์ฐจ์ ์ธ๋ฑ์ฑ
- ๊ณ ๊ธ ์ฌ๋ผ์ด์ฑ
- ์กฐ๊ฑด๋ถ ์ ํ
- ๋ถ๋ฆฌ์ธ ๋ง์คํน
- ํฌ์ ์ธ๋ฑ์ฑ
- ๋ทฐ์ ๋ณต์ฌ ๊ตฌ๋ถ
NumPy๋ ๋ฐ์ดํฐ ๋ถ์์ ํ์ํ ๋ค์ํ ํต๊ณ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# ๊ธฐ๋ณธ ํต๊ณ
print(np.mean(arr)) # ํ๊ท
print(np.median(arr)) # ์ค์๊ฐ
print(np.std(arr)) # ํ์คํธ์ฐจ
print(np.var(arr)) # ๋ถ์ฐ
print(np.percentile(arr, 75)) # 75% ๋ฐฑ๋ถ์
# ์ถ๋ณ ์ฐ์ฐ
print(np.sum(arr, axis=0)) # ์ด๋ณ ํฉ
print(np.mean(arr, axis=1)) # ํ๋ณ ํ๊ท
print(np.std(arr, axis=None)) # ์ ์ฒด ํ์คํธ์ฐจ
# ์ต๋/์ต์ ๋ฐ ์์น
print(np.max(arr)) # ์ต๋๊ฐ
print(np.min(arr)) # ์ต์๊ฐ
print(np.argmax(arr)) # ์ต๋๊ฐ ์ธ๋ฑ์ค (ํํํ๋ ๋ฐฐ์ด์์)
print(np.argmin(arr, axis=0)) # ์ด๋ณ ์ต์๊ฐ ์ธ๋ฑ์ค
# ์๊ด๊ด๊ณ์ ๊ณต๋ถ์ฐ
data = np.random.randn(3, 4) # ํ์ค ์ ๊ท ๋ถํฌ ๋์
print(np.corrcoef(data)) # ์๊ด๊ณ์ ํ๋ ฌ
print(np.cov(data)) # ๊ณต๋ถ์ฐ ํ๋ ฌ
โ
ํน์ง:
- ๊ธฐ์ ํต๊ณ๋
- ์ถ๋ณ ์ฐ์ฐ
- ์ต๋/์ต์ ๋ถ์
- ๋ฐฑ๋ถ์์ ๊ณ์ฐ
- ์๊ด๊ด๊ณ ๋ถ์
- ์ง๊ณ ํจ์ ์ง์
๋ธ๋ก๋์บ์คํ
์ NumPy์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ผ๋ก, ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ฐฐ์ด ๊ฐ ์ฐ์ฐ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
# ๋ธ๋ก๋์บ์คํ
์์
arr = np.array([[1, 2, 3],
[4, 5, 6]])
# ์ค์นผ๋ผ ์ฐ์ฐ (๋ชจ๋ ์์์ ์ ์ฉ)
print(arr + 2) # ๋ชจ๋ ์์์ 2 ๋ํ๊ธฐ
print(arr * 3) # ๋ชจ๋ ์์์ 3 ๊ณฑํ๊ธฐ
# ๋ฒกํฐ์ ํ๋ ฌ ์ฐ์ฐ
vec = np.array([1, 0, 1]) # ๊ธธ์ด 3 ๋ฒกํฐ
print(arr + vec) # ๊ฐ ํ์ ๋ฒกํฐ ๋ํ๊ธฐ
row_vec = np.array([[10, 20]]) # 1x2 ํ ๋ฒกํฐ
col_mat = np.array([[1], [2], [3]]) # 3x1 ์ด ๋ฒกํฐ
print(row_vec + col_mat) # 3x2 ํ๋ ฌ๋ก ๋ธ๋ก๋์บ์คํ
# ์ฐจ์ ๋ค๋ฅธ ๋ฐฐ์ด ์ฐ์ฐ
a = np.array([[1], [2], [3]]) # 3x1 ๋ฐฐ์ด
b = np.array([4, 5, 6]) # 1x3 ๋ฐฐ์ด
print(a + b) # ๋ธ๋ก๋์บ์คํ
์ผ๋ก 3x3 ๋ฐฐ์ด๋ก ํ์ฅ
# ๋ธ๋ก๋์บ์คํ
๊ท์น ์๊ฐํ
x = np.arange(4)
y = np.arange(5).reshape(5, 1)
print(x + y) # ๋ธ๋ก๋์บ์คํ
์ผ๋ก 4x5 ๊ทธ๋ฆฌ๋ ์์ฑ
โ
ํน์ง:
- ์๋ ํฌ๊ธฐ ์กฐ์
- ํจ์จ์ ์ธ ์ฐ์ฐ
- ์ฐจ์ ํธํ์ฑ
- ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
- ๋ฒกํฐํ ์ฝ๋
- ์ง๊ด์ ์ธ ๊ตฌ๋ฌธ
NumPy์ ๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ํ์ฉํ ์ค์ ์์ ์ด๋ค.
# ๋์ ๋ฐ ์ํ๋ง
np.random.seed(42) # ์ฌํ์ฑ์ ์ํ ์๋ ์ค์
uniform_samples = np.random.uniform(0, 1, 1000) # ๊ท ๋ฑ ๋ถํฌ
normal_samples = np.random.normal(0, 1, 1000) # ์ ๊ท ๋ถํฌ
choice = np.random.choice(['A', 'B', 'C'], 10, p=[0.5, 0.3, 0.2]) # ๊ฐ์ค์น ์๋ ์ ํ
# ๋ฐฐ์ด ํํ ๋ณํ
arr = np.arange(12)
print(arr.reshape(3, 4)) # 3x4 ํ๋ ฌ๋ก ๋ณํ
print(arr.reshape(3, -1)) # ์๋ ์ด ๊ณ์ฐ
print(np.reshape(arr, (2, 2, 3))) # 3์ฐจ์ ํ
์๋ก ๋ณํ
# ์ถ ๋ณํ ๋ฐ ์ ์น
tensor = np.random.rand(2, 3, 4)
print(np.transpose(tensor, (2, 0, 1))) # ์ถ ์์ ๋ณ๊ฒฝ
# ๋ฐฐ์ด ์ฐ๊ฒฐ ๋ฐ ๋ถํ
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.concatenate([a, b])) # 1์ฐจ์ ์ฐ๊ฒฐ
print(np.vstack([a, b])) # ์์ง ์๊ธฐ
print(np.hstack([a.reshape(-1, 1), b.reshape(-1, 1)])) # ์ํ ์๊ธฐ
print(np.split(np.arange(10), 5)) # ๊ท ๋ฑ ๋ถํ
print(np.array_split(np.arange(10), 3)) # ๋ถ๊ท ๋ฑ ๋ถํ
# ์ ๋๋ฒ์ค ํจ์ (ufunc)
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x) # ์ฌ์ธ ํจ์
z = np.exp(x) # ์ง์ ํจ์
print(np.allclose(np.sin(x)**2 + np.cos(x)**2, 1)) # ์ผ๊ฐ ํญ๋ฑ์ ๊ฒ์ฆ
โ
ํน์ง:
- ๋์ ์์ฑ
- ๋ฐฐ์ด ์ฌ๊ตฌ์กฐํ
- ์ถ ๋ณํ
- ๋ฐฐ์ด ๊ฒฐํฉ/๋ถํ
- ์ํ์ ํจ์
- ์ฑ๋ฅ ์ต์ ํ ์ฐ์ฐ
โ
๋ชจ๋ฒ ์ฌ๋ก:
- ๋ฒกํฐํ ์ฐ์ฐ ํ์ฉ
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ๊ณ ๋ ค
- ๋ธ๋ก๋์บ์คํ ์ดํด
- ์ถ(axis) ๊ฐ๋ ์์ง
- ๋ฐ์ดํฐ ํ์ ์ต์ ํ
- ๋ทฐ์ ๋ณต์ฌ ๊ตฌ๋ถ
- ์ธ๋ฑ์ฑ ์ต์ ํ
- ์ ํ๋์ ํ์ฉ
- ๋์ ์์ฑ ์ ์ด
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง