KR_Numpy - somaz94/python-study GitHub Wiki

Python NumPy ๊ฐœ๋… ์ •๋ฆฌ


1๏ธโƒฃ NumPy ๊ธฐ์ดˆ

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 ์‚ฌ์ด ๋‚œ์ˆ˜ ํ–‰๋ ฌ

โœ… ํŠน์ง•:

  • ๋‹ค์ฐจ์› ๋ฐฐ์—ด ์ƒ์„ฑ
  • ํŠน์ˆ˜ ํ–‰๋ ฌ ์ƒ์„ฑ
  • ์ˆ˜์—ด ์ƒ์„ฑ
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ
  • ๋ฒกํ„ฐํ™” ์—ฐ์‚ฐ
  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…


2๏ธโƒฃ ํ–‰๋ ฌ ์—ฐ์‚ฐ

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}")

โœ… ํŠน์ง•:

  • ๊ธฐ๋ณธ ํ–‰๋ ฌ ์—ฐ์‚ฐ
  • ์„ ํ˜•๋Œ€์ˆ˜ ์—ฐ์‚ฐ
  • ํ–‰๋ ฌ ๋ถ„ํ•ด
  • ํšจ์œจ์ ์ธ ๊ณ„์‚ฐ
  • ์ˆ˜ํ•™์  ํ•จ์ˆ˜
  • ๊ณ ๊ธ‰ ์„ ํ˜•๋Œ€์ˆ˜ ๊ธฐ๋Šฅ


3๏ธโƒฃ ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ

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])  # ๊ต์ฐจ ์„ ํƒ

โœ… ํŠน์ง•:

  • ๋‹ค์ฐจ์› ์ธ๋ฑ์‹ฑ
  • ๊ณ ๊ธ‰ ์Šฌ๋ผ์ด์‹ฑ
  • ์กฐ๊ฑด๋ถ€ ์„ ํƒ
  • ๋ถˆ๋ฆฌ์–ธ ๋งˆ์Šคํ‚น
  • ํŒฌ์‹œ ์ธ๋ฑ์‹ฑ
  • ๋ทฐ์™€ ๋ณต์‚ฌ ๊ตฌ๋ถ„


4๏ธโƒฃ ํ†ต๊ณ„์™€ ์ง‘๊ณ„

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))           # ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ

โœ… ํŠน์ง•:

  • ๊ธฐ์ˆ  ํ†ต๊ณ„๋Ÿ‰
  • ์ถ•๋ณ„ ์—ฐ์‚ฐ
  • ์ตœ๋Œ€/์ตœ์†Œ ๋ถ„์„
  • ๋ฐฑ๋ถ„์œ„์ˆ˜ ๊ณ„์‚ฐ
  • ์ƒ๊ด€๊ด€๊ณ„ ๋ถ„์„
  • ์ง‘๊ณ„ ํ•จ์ˆ˜ ์ง€์›


5๏ธโƒฃ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…

๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์€ 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 ๊ทธ๋ฆฌ๋“œ ์ƒ์„ฑ

โœ… ํŠน์ง•:

  • ์ž๋™ ํฌ๊ธฐ ์กฐ์ •
  • ํšจ์œจ์ ์ธ ์—ฐ์‚ฐ
  • ์ฐจ์› ํ˜ธํ™˜์„ฑ
  • ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
  • ๋ฒกํ„ฐํ™” ์ฝ”๋“œ
  • ์ง๊ด€์ ์ธ ๊ตฌ๋ฌธ


6๏ธโƒฃ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊ณผ ํ™œ์šฉ

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) ๊ฐœ๋… ์ˆ™์ง€
  • ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ตœ์ ํ™”
  • ๋ทฐ์™€ ๋ณต์‚ฌ ๊ตฌ๋ถ„
  • ์ธ๋ฑ์‹ฑ ์ตœ์ ํ™”
  • ์„ ํ˜•๋Œ€์ˆ˜ ํ™œ์šฉ
  • ๋‚œ์ˆ˜ ์ƒ์„ฑ ์ œ์–ด
  • ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง


โš ๏ธ **GitHub.com Fallback** โš ๏ธ