2. NumPy ๊ณ ๊ธ‰

2. NumPy ๊ณ ๊ธ‰

์ด์ „: NumPy ๊ธฐ์ดˆ | ๋‹ค์Œ: Pandas ๊ธฐ์ดˆ

๊ฐœ์š”

NumPy์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ธ ์„ ํ˜•๋Œ€์ˆ˜, ํ†ต๊ณ„ ํ•จ์ˆ˜, ๋‚œ์ˆ˜ ์ƒ์„ฑ, ๊ตฌ์กฐํ™”๋œ ๋ฐฐ์—ด, ๊ทธ๋ฆฌ๊ณ  ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.


1. ์„ ํ˜•๋Œ€์ˆ˜ (Linear Algebra)

1.1 ํ–‰๋ ฌ ๊ณฑ์…ˆ

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# ํ–‰๋ ฌ ๊ณฑ์…ˆ (dot product)
C = np.dot(A, B)
print(C)
# [[19 22]
#  [43 50]]

# @ ์—ฐ์‚ฐ์ž (Python 3.5+)
C = A @ B

# matmul ํ•จ์ˆ˜
C = np.matmul(A, B)

# ๋ฒกํ„ฐ ๋‚ด์ 
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
dot_product = np.dot(v1, v2)  # 32

1.2 ํ–‰๋ ฌ ๋ถ„ํ•ด

A = np.array([[1, 2], [3, 4]])

# ํ–‰๋ ฌ์‹ (Determinant)
det = np.linalg.det(A)
print(det)  # -2.0

# ์—ญํ–‰๋ ฌ (Inverse)
A_inv = np.linalg.inv(A)
print(A_inv)
# [[-2.   1. ]
#  [ 1.5 -0.5]]

# ๊ฒ€์ฆ: A @ A_inv = I
print(A @ A_inv)
# [[1. 0.]
#  [0. 1.]]

# ๊ณ ์œ ๊ฐ’๊ณผ ๊ณ ์œ ๋ฒกํ„ฐ
eigenvalues, eigenvectors = np.linalg.eig(A)
print("๊ณ ์œ ๊ฐ’:", eigenvalues)
print("๊ณ ์œ ๋ฒกํ„ฐ:\n", eigenvectors)

# ํŠน์ด๊ฐ’ ๋ถ„ํ•ด (SVD)
U, S, Vt = np.linalg.svd(A)
print("U:\n", U)
print("S:", S)
print("Vt:\n", Vt)

# QR ๋ถ„ํ•ด
Q, R = np.linalg.qr(A)

# ์ด๋ ˆ์Šคํ‚ค ๋ถ„ํ•ด (๋Œ€์นญ ์–‘์ •์น˜ ํ–‰๋ ฌ)
B = np.array([[4, 2], [2, 5]])
L = np.linalg.cholesky(B)

1.3 ์„ ํ˜• ๋ฐฉ์ •์‹ ํ’€์ด

# Ax = b ํ˜•ํƒœ์˜ ์„ ํ˜• ์‹œ์Šคํ…œ
# 2x + y = 5
# x + 3y = 6

A = np.array([[2, 1], [1, 3]])
b = np.array([5, 6])

# ํ•ด ๊ตฌํ•˜๊ธฐ
x = np.linalg.solve(A, b)
print(x)  # [1.8 1.4]

# ๊ฒ€์ฆ
print(A @ x)  # [5. 6.]

# ์ตœ์†Œ ์ž์Šน๋ฒ• (Least Squares)
A = np.array([[1, 1], [1, 2], [1, 3], [1, 4]])
b = np.array([2, 3, 4.5, 5])
x, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
print("๊ณ„์ˆ˜:", x)  # [0.75 1.1]

1.4 ํ–‰๋ ฌ ๋…ธ๋ฆ„๊ณผ ์กฐ๊ฑด์ˆ˜

A = np.array([[1, 2], [3, 4]])

# ํ”„๋กœ๋ฒ ๋‹ˆ์šฐ์Šค ๋…ธ๋ฆ„ (Frobenius norm)
fro_norm = np.linalg.norm(A, 'fro')

# L2 ๋…ธ๋ฆ„ (์ŠคํŽ™ํŠธ๋Ÿด ๋…ธ๋ฆ„)
l2_norm = np.linalg.norm(A, 2)

# L1 ๋…ธ๋ฆ„
l1_norm = np.linalg.norm(A, 1)

# ๋ฌดํ•œ๋Œ€ ๋…ธ๋ฆ„
inf_norm = np.linalg.norm(A, np.inf)

# ๋ฒกํ„ฐ ๋…ธ๋ฆ„
v = np.array([3, 4])
print(np.linalg.norm(v))  # 5.0 (์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ)

# ์กฐ๊ฑด์ˆ˜ (Condition Number)
cond = np.linalg.cond(A)
print("์กฐ๊ฑด์ˆ˜:", cond)

1.5 ํ–‰๋ ฌ ๋žญํฌ์™€ ํŠธ๋ ˆ์ด์Šค

A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# ๋žญํฌ
rank = np.linalg.matrix_rank(A)
print("๋žญํฌ:", rank)  # 2

# ํŠธ๋ ˆ์ด์Šค (๋Œ€๊ฐ์„  ํ•ฉ)
trace = np.trace(A)
print("ํŠธ๋ ˆ์ด์Šค:", trace)  # 15

2. ํ†ต๊ณ„ ํ•จ์ˆ˜

2.1 ๊ธฐ์ˆ  ํ†ต๊ณ„

data = np.array([23, 45, 67, 89, 12, 34, 56, 78, 90, 11])

# ๊ธฐ๋ณธ ํ†ต๊ณ„
print("ํ‰๊ท :", np.mean(data))      # 50.5
print("์ค‘์•™๊ฐ’:", np.median(data))  # 50.5
print("ํ‘œ์ค€ํŽธ์ฐจ:", np.std(data))   # 28.07
print("๋ถ„์‚ฐ:", np.var(data))       # 788.25
print("์ตœ์†Œ:", np.min(data))       # 11
print("์ตœ๋Œ€:", np.max(data))       # 90
print("๋ฒ”์œ„:", np.ptp(data))       # 79 (peak to peak)

# ๋ฐฑ๋ถ„์œ„์ˆ˜
print("25%:", np.percentile(data, 25))
print("50%:", np.percentile(data, 50))
print("75%:", np.percentile(data, 75))

# ๋ถ„์œ„์ˆ˜
print("1์‚ฌ๋ถ„์œ„:", np.quantile(data, 0.25))
print("3์‚ฌ๋ถ„์œ„:", np.quantile(data, 0.75))

2.2 ์ƒ๊ด€๊ณ„์ˆ˜์™€ ๊ณต๋ถ„์‚ฐ

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# ์ƒ๊ด€๊ณ„์ˆ˜ ํ–‰๋ ฌ
corr_matrix = np.corrcoef(x, y)
print(corr_matrix)
# [[1.   0.77]
#  [0.77 1.  ]]

# ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ
cov_matrix = np.cov(x, y)
print(cov_matrix)
# [[2.5 1.5]
#  [1.5 1.3]]

# ๋‹ค๋ณ€๋Ÿ‰ ๋ฐ์ดํ„ฐ
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.corrcoef(data))  # ๋ณ€์ˆ˜ ๊ฐ„ ์ƒ๊ด€๊ณ„์ˆ˜

2.3 ํžˆ์Šคํ† ๊ทธ๋žจ๊ณผ ๋นˆ๋„

data = np.random.randn(1000)

# ํžˆ์Šคํ† ๊ทธ๋žจ ๊ณ„์‚ฐ
counts, bin_edges = np.histogram(data, bins=10)
print("๋นˆ๋„:", counts)
print("๊ตฌ๊ฐ„:", bin_edges)

# ๋นˆ ์ง€์ •
counts, bin_edges = np.histogram(data, bins=[-3, -2, -1, 0, 1, 2, 3])

# ๊ณ ์œ ๊ฐ’๊ณผ ๋นˆ๋„
arr = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
unique, counts = np.unique(arr, return_counts=True)
print("๊ณ ์œ ๊ฐ’:", unique)   # [1 2 3 4]
print("๋นˆ๋„:", counts)     # [1 2 3 4]

3. ๋‚œ์ˆ˜ ์ƒ์„ฑ

3.1 ๊ธฐ๋ณธ ๋‚œ์ˆ˜ ์ƒ์„ฑ

# ์ƒˆ๋กœ์šด ๋ฐฉ์‹ (NumPy 1.17+)
rng = np.random.default_rng(seed=42)

# ๊ท ์ผ ๋ถ„ํฌ [0, 1)
print(rng.random(5))

# ์ •์ˆ˜ ๋‚œ์ˆ˜
print(rng.integers(1, 100, size=10))

# ๊ท ์ผ ๋ถ„ํฌ [low, high)
print(rng.uniform(0, 10, size=5))

# ๋ ˆ๊ฑฐ์‹œ ๋ฐฉ์‹
np.random.seed(42)
print(np.random.rand(5))        # [0, 1) ๊ท ์ผ ๋ถ„ํฌ
print(np.random.randint(1, 10, 5))  # ์ •์ˆ˜ ๋‚œ์ˆ˜

3.2 ํ™•๋ฅ  ๋ถ„ํฌ

rng = np.random.default_rng(42)

# ์ •๊ทœ ๋ถ„ํฌ (๊ฐ€์šฐ์‹œ์•ˆ)
normal = rng.normal(loc=0, scale=1, size=1000)  # ํ‰๊ท  0, ํ‘œ์ค€ํŽธ์ฐจ 1
print(f"ํ‰๊ท : {normal.mean():.3f}, ํ‘œ์ค€ํŽธ์ฐจ: {normal.std():.3f}")

# ํ‘œ์ค€ ์ •๊ทœ ๋ถ„ํฌ
standard_normal = rng.standard_normal(1000)

# ์ดํ•ญ ๋ถ„ํฌ
binomial = rng.binomial(n=10, p=0.5, size=1000)  # n๋ฒˆ ์‹œํ–‰, ์„ฑ๊ณต ํ™•๋ฅ  p

# ํฌ์•„์†ก ๋ถ„ํฌ
poisson = rng.poisson(lam=5, size=1000)  # ํ‰๊ท  5

# ์ง€์ˆ˜ ๋ถ„ํฌ
exponential = rng.exponential(scale=2, size=1000)

# ๋ฒ ํƒ€ ๋ถ„ํฌ
beta = rng.beta(a=2, b=5, size=1000)

# ๊ฐ๋งˆ ๋ถ„ํฌ
gamma = rng.gamma(shape=2, scale=1, size=1000)

# ์นด์ด์ œ๊ณฑ ๋ถ„ํฌ
chisquare = rng.chisquare(df=5, size=1000)

# t ๋ถ„ํฌ
t = rng.standard_t(df=10, size=1000)

3.3 ๋žœ๋ค ์ƒ˜ํ”Œ๋ง

rng = np.random.default_rng(42)

arr = np.array([10, 20, 30, 40, 50])

# ๋žœ๋ค ์„ ํƒ
sample = rng.choice(arr, size=3, replace=False)  # ๋น„๋ณต์› ์ถ”์ถœ
print(sample)

# ํ™•๋ฅ  ๊ฐ€์ค‘์น˜
weights = [0.1, 0.1, 0.3, 0.3, 0.2]
sample = rng.choice(arr, size=10, p=weights)

# ๋ฐฐ์—ด ์…”ํ”Œ
arr_copy = arr.copy()
rng.shuffle(arr_copy)
print(arr_copy)

# ์ˆœ์—ด (์ƒˆ ๋ฐฐ์—ด ๋ฐ˜ํ™˜)
permuted = rng.permutation(arr)
print(permuted)

4. ๊ตฌ์กฐํ™”๋œ ๋ฐฐ์—ด

4.1 ๊ตฌ์กฐํ™”๋œ dtype

# ๊ตฌ์กฐํ™”๋œ ๋ฐฐ์—ด ์ •์˜
dt = np.dtype([
    ('name', 'U20'),      # ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด (์ตœ๋Œ€ 20์ž)
    ('age', 'i4'),        # 32๋น„ํŠธ ์ •์ˆ˜
    ('height', 'f8'),     # 64๋น„ํŠธ ์‹ค์ˆ˜
    ('is_student', '?')   # ๋ถˆ๋ฆฌ์–ธ
])

# ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
data = np.array([
    ('Alice', 25, 165.5, True),
    ('Bob', 30, 178.2, False),
    ('Charlie', 22, 172.0, True)
], dtype=dt)

# ํ•„๋“œ ์ ‘๊ทผ
print(data['name'])    # ['Alice' 'Bob' 'Charlie']
print(data['age'])     # [25 30 22]
print(data[0])         # ('Alice', 25, 165.5, True)
print(data[0]['name']) # Alice

# ์กฐ๊ฑด ํ•„ํ„ฐ๋ง
students = data[data['is_student']]
print(students['name'])

4.2 ๋ ˆ์ฝ”๋“œ ๋ฐฐ์—ด

# recarray๋กœ ๋ณ€ํ™˜ (์†์„ฑ ์ ‘๊ทผ ๊ฐ€๋Šฅ)
rec = data.view(np.recarray)
print(rec.name)    # ['Alice' 'Bob' 'Charlie']
print(rec.age)     # [25 30 22]
print(rec[0].name) # Alice

5. ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ๊ณผ ์„ฑ๋Šฅ

5.1 C-order vs Fortran-order

# C-order (ํ–‰ ์šฐ์„ ): ๊ธฐ๋ณธ๊ฐ’
c_arr = np.array([[1, 2, 3], [4, 5, 6]], order='C')
print(c_arr.flags['C_CONTIGUOUS'])  # True

# Fortran-order (์—ด ์šฐ์„ )
f_arr = np.array([[1, 2, 3], [4, 5, 6]], order='F')
print(f_arr.flags['F_CONTIGUOUS'])  # True

# ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ํ™•์ธ
print(c_arr.strides)  # (24, 8) - ํ–‰ ์ด๋™ 24๋ฐ”์ดํŠธ, ์—ด ์ด๋™ 8๋ฐ”์ดํŠธ
print(f_arr.strides)  # (8, 16)

5.2 ๋ทฐ์™€ ๋ณต์‚ฌ ์„ฑ๋Šฅ

import time

arr = np.arange(10000000)

# ์Šฌ๋ผ์ด์‹ฑ (๋ทฐ) - ๋น ๋ฆ„
start = time.time()
view = arr[::2]
print(f"๋ทฐ ์ƒ์„ฑ: {time.time() - start:.6f}์ดˆ")

# ๋ณต์‚ฌ - ๋А๋ฆผ
start = time.time()
copy = arr[::2].copy()
print(f"๋ณต์‚ฌ: {time.time() - start:.6f}์ดˆ")

5.3 ๋ฒกํ„ฐํ™” vs ๋ฃจํ”„

import time

n = 1000000
arr = np.random.rand(n)

# ํŒŒ์ด์ฌ ๋ฃจํ”„ (๋А๋ฆผ)
start = time.time()
result = []
for x in arr:
    result.append(x ** 2)
print(f"ํŒŒ์ด์ฌ ๋ฃจํ”„: {time.time() - start:.4f}์ดˆ")

# NumPy ๋ฒกํ„ฐํ™” (๋น ๋ฆ„)
start = time.time()
result = arr ** 2
print(f"NumPy ๋ฒกํ„ฐํ™”: {time.time() - start:.4f}์ดˆ")

5.4 Universal Functions ์ตœ์ ํ™”

# where ์‚ฌ์šฉ
arr = np.array([1, -2, 3, -4, 5])
result = np.where(arr > 0, arr, 0)  # ์–‘์ˆ˜๋Š” ์œ ์ง€, ์Œ์ˆ˜๋Š” 0
print(result)  # [1 0 3 0 5]

# select ์‚ฌ์šฉ (๋‹ค์ค‘ ์กฐ๊ฑด)
conditions = [arr < 0, arr == 0, arr > 0]
choices = [-1, 0, 1]
result = np.select(conditions, choices)
print(result)  # [ 1 -1  1 -1  1]

# clip ์‚ฌ์šฉ
arr = np.array([-5, -2, 0, 3, 7, 10])
result = np.clip(arr, 0, 5)  # 0๊ณผ 5 ์‚ฌ์ด๋กœ ์ œํ•œ
print(result)  # [0 0 0 3 5 5]

6. ๊ณ ๊ธ‰ ์ธ๋ฑ์‹ฑ๊ณผ ๋งˆ์Šคํ‚น

6.1 np.where ํ™œ์šฉ

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ธ๋ฑ์Šค
indices = np.where(arr > 5)
print(indices)  # (array([1, 2, 2, 2]), array([2, 0, 1, 2]))

# ์กฐ๊ฑด๋ถ€ ๊ฐ’ ํ• ๋‹น
result = np.where(arr % 2 == 0, 'even', 'odd')
print(result)

6.2 np.take์™€ np.put

arr = np.array([10, 20, 30, 40, 50])

# take: ์ธ๋ฑ์Šค๋กœ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ
indices = [0, 2, 4]
print(np.take(arr, indices))  # [10 30 50]

# put: ์ธ๋ฑ์Šค ์œ„์น˜์— ๊ฐ’ ๋„ฃ๊ธฐ
np.put(arr, [0, 2, 4], [100, 300, 500])
print(arr)  # [100  20 300  40 500]

6.3 ๋งˆ์Šคํฌ ๋ฐฐ์—ด

# ๋งˆ์Šคํฌ ๋ฐฐ์—ด ์ƒ์„ฑ
data = np.array([1, 2, -999, 4, -999, 6])
mask = (data == -999)

masked_arr = np.ma.masked_array(data, mask)
print(masked_arr)  # [1 2 -- 4 -- 6]
print(masked_arr.mean())  # 3.25 (๋งˆ์Šคํฌ๋œ ๊ฐ’ ์ œ์™ธ)

# ๋งˆ์Šคํฌ๋œ ๊ฐ’ ์ฑ„์šฐ๊ธฐ
filled = masked_arr.filled(0)
print(filled)  # [1 2 0 4 0 6]

7. ๋ฐฐ์—ด ์ €์žฅ๊ณผ ๋กœ๋”ฉ

7.1 ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹

arr = np.array([[1, 2, 3], [4, 5, 6]])

# ๋‹จ์ผ ๋ฐฐ์—ด ์ €์žฅ/๋กœ๋”ฉ
np.save('array.npy', arr)
loaded = np.load('array.npy')

# ์—ฌ๋Ÿฌ ๋ฐฐ์—ด ์ €์žฅ/๋กœ๋”ฉ
np.savez('arrays.npz', arr1=arr, arr2=arr*2)
data = np.load('arrays.npz')
print(data['arr1'])
print(data['arr2'])

# ์••์ถ• ์ €์žฅ
np.savez_compressed('arrays_compressed.npz', arr1=arr)

7.2 ํ…์ŠคํŠธ ํ˜•์‹

arr = np.array([[1, 2, 3], [4, 5, 6]])

# CSV ์ €์žฅ
np.savetxt('array.csv', arr, delimiter=',', fmt='%d')

# CSV ๋กœ๋”ฉ
loaded = np.loadtxt('array.csv', delimiter=',')

# ํ—ค๋”์™€ ํ•จ๊ป˜ ์ €์žฅ
np.savetxt('array_header.csv', arr, delimiter=',',
           header='col1,col2,col3', comments='')

# genfromtxt (๊ฒฐ์ธก๊ฐ’ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)
data = np.genfromtxt('array.csv', delimiter=',',
                     missing_values='NA', filling_values=0)

8. ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘

๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ „๋ถ€ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

# ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ๋ฐฐ์—ด ์ƒ์„ฑ
shape = (10000, 10000)
dtype = np.float64

# ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘
mmap = np.memmap('large_array.dat', dtype=dtype, mode='w+', shape=shape)
mmap[:100, :100] = np.random.rand(100, 100)
mmap.flush()  # ๋””์Šคํฌ์— ์“ฐ๊ธฐ

# ์ฝ๊ธฐ ์ „์šฉ ๋กœ๋”ฉ
mmap_read = np.memmap('large_array.dat', dtype=dtype, mode='r', shape=shape)
print(mmap_read[:10, :10])

์—ฐ์Šต ๋ฌธ์ œ

๋ฌธ์ œ 1: ์„ ํ˜• ํšŒ๊ท€

๋‹ค์Œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ตœ์†Œ ์ž์Šน๋ฒ•์œผ๋กœ ์„ ํ˜• ํšŒ๊ท€ ๊ณ„์ˆ˜๋ฅผ ๊ตฌํ•˜์„ธ์š”.

x = np.array([1, 2, 3, 4, 5])
y = np.array([2.2, 2.8, 3.6, 4.5, 5.1])

# ํ’€์ด
A = np.vstack([x, np.ones(len(x))]).T
m, c = np.linalg.lstsq(A, y, rcond=None)[0]
print(f"๊ธฐ์šธ๊ธฐ: {m:.3f}, ์ ˆํŽธ: {c:.3f}")

๋ฌธ์ œ 2: ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ๊ณ ์œ ๊ฐ’ ๋ถ„ํ•ด

3๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์˜ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ๊ตฌํ•˜๊ณ  ๊ณ ์œ ๊ฐ’ ๋ถ„ํ•ดํ•˜์„ธ์š”.

data = np.random.randn(100, 3)
data[:, 1] = data[:, 0] * 2 + np.random.randn(100) * 0.1  # ์ƒ๊ด€๊ด€๊ณ„ ์ถ”๊ฐ€

# ํ’€์ด
cov_matrix = np.cov(data.T)
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
print("๊ณ ์œ ๊ฐ’:", eigenvalues)
print("๊ณ ์œ ๋ฒกํ„ฐ:\n", eigenvectors)

๋ฌธ์ œ 3: ๋ชฌํ…Œ์นด๋ฅผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๋‚œ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์›์˜ ๋„“์ด(ฯ€)๋ฅผ ์ถ”์ •ํ•˜์„ธ์š”.

# ํ’€์ด
n = 1000000
rng = np.random.default_rng(42)
x = rng.uniform(-1, 1, n)
y = rng.uniform(-1, 1, n)
inside = (x**2 + y**2) <= 1
pi_estimate = 4 * inside.sum() / n
print(f"ฯ€ ์ถ”์ •๊ฐ’: {pi_estimate:.6f}")

์š”์•ฝ

๊ธฐ๋Šฅ ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ
ํ–‰๋ ฌ ๊ณฑ์…ˆ np.dot(), @, np.matmul()
์„ ํ˜•๋Œ€์ˆ˜ np.linalg.inv(), solve(), eig(), svd()
ํ†ต๊ณ„ np.mean(), np.std(), np.corrcoef(), np.cov()
๋‚œ์ˆ˜ np.random.default_rng(), random(), normal(), choice()
์ €์žฅ/๋กœ๋”ฉ np.save(), np.load(), np.savetxt(), np.loadtxt()
์„ฑ๋Šฅ ๋ฒกํ„ฐํ™” ์—ฐ์‚ฐ, np.where(), ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘
to navigate between lessons