๐ŸงŠ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ Python: NumPy

Geondong Kimยท4์ผ ์ „
post-thumbnail

๐ŸงŠ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ Python: NumPy Part 1 ๊ธฐ์ดˆ

1. NumPy ๊ฐœ์š”

  • NumPy (Numerical Python): ํŒŒ์ด์ฌ์—์„œ ๊ณผํ•™์  ๊ณ„์‚ฐ์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ํŒจํ‚ค์ง€.
  • ํŠน์ง•:
    • ndarray (n-dimensional array): ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ list์™€ ๋‹ฌ๋ฆฌ, ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…(dtype)์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ: C์–ธ์–ด ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์–ด, ๊ธฐ๋ณธ list๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์ฐจ์ง€ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ ์‹œ ํฌ๊ธฐ ๊ณ ์ •: ๋ฆฌ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ ์ƒ์„ฑ๋  ๋•Œ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง.
    • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…: ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…(dtype)์„ ๊ฐ€์ ธ์•ผ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ๊ทน๋Œ€ํ™”๋จ.
    • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์˜ ๋น ๋ฅธ ๋ฒกํ„ฐ ์—ฐ์‚ฐ ๋ฐ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ์ง€์›.

2. ๋ฐฐ์—ด์˜ ๊ธฐ์ดˆ์™€ ์—ฐ์‚ฐ

2.1 ๋ฐฐ์—ด ๋ชจ์–‘ (Shape)๊ณผ ์ธ๋ฑ์Šค

  • ๋ฐฐ์—ด์˜ ์ฐจ์›๊ณผ ๋ชจ์–‘์„ ์ดํ•ดํ•ด์•ผ ์ธ๋ฑ์‹ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ.
  • ์˜ˆ์ œ: 3์ฐจ์› ๋ฐฐ์—ด (2, 3, 4) ํ˜•ํƒœ์—์„œ ๊ฐ’ 24 ์ฐพ๊ธฐ
    # (2, 3, 4) ํ˜•ํƒœ์˜ 3์ฐจ์› ๋ฐฐ์—ด
    array([[[ 1,  2,  3], 
            [ 4,  5,  6], 
            [ 7,  8,  9], 
            [10, 11, 12]], 
           [[13, 14, 15], 
            [16, 17, 18], 
            [19, 20, 21], 
            [22, 23, 24]]])
    
    # ๊ฐ’ 24์— ์ ‘๊ทผํ•˜๊ธฐ (0-based index)
    # ์ฒซ ๋ฒˆ์งธ ์ฐจ์› index 1 (๋‘ ๋ฒˆ์งธ ๋ฉ์–ด๋ฆฌ)
    # ๋‘ ๋ฒˆ์งธ ์ฐจ์› index 3 (๋„ค ๋ฒˆ์งธ ํ–‰ - ๋งŒ์•ฝ ํ–‰์ด 4๊ฐœ๋ผ๋ฉด)
    # ์„ธ ๋ฒˆ์งธ ์ฐจ์› index 2 (์„ธ ๋ฒˆ์งธ ์—ด)
    print(arr[1, 3, 2])
    • ์ธ๋ฑ์Šค: [1, 3, 2] (0-based index ๊ธฐ์ค€ [1, 3, 2]๋Š” shape (2, 4, 3)์ผ ๋•Œ ๊ฐ€๋Šฅ, (2, 3, 4)๋ผ๋ฉด [1, 2, 3] ๋“ฑ ํ™•์ธ ํ•„์š”)

2.2 ๋ฒกํ„ฐํ™” ์—ฐ์‚ฐ (Vectorization)

๋ฐฐ์—ด์ด๋‚˜ ํ–‰๋ ฌ๊ณผ ๊ฐ™์€ ๋‹ค์ฐจ์› ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์š”์†Œ ๋ณ„ ์—ฐ์‚ฐ์„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • Loop ์‚ฌ์šฉ ๊ธˆ์ง€: ๋ฐฐ์—ด ๊ฐ„์˜ ์—ฐ์‚ฐ ์‹œ for ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋А๋ฆผ.
  • ์žฅ์ : ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ C๋กœ ์ตœ์ ํ™”๋œ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜์–ด ์†๋„๊ฐ€ ํš๊ธฐ์ ์œผ๋กœ ๋น ๋ฆ„.
  • Element-wise Operation (์š”์†Œ๋ณ„ ์—ฐ์‚ฐ): c = a * b์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๊ฐ™์€ ์œ„์น˜์˜ ์š”์†Œ๋ผ๋ฆฌ ๊ณฑ์…ˆ์ด ์ˆ˜ํ–‰๋จ. (ํ–‰๋ ฌ ๊ณฑ ์•„๋‹˜)

2.3 ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… (Broadcasting)

  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ์–‘(Shape)์˜ ๋ฐฐ์—ด ๊ฐ„ ์—ฐ์‚ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ทœ์น™.
  • ๋™์ž‘ ์กฐ๊ฑด (๋’ค์ชฝ[์˜ค๋ฅธ์ชฝ] ์ฐจ์›๋ถ€ํ„ฐ ๋น„๊ต):
    1. ์ฐจ์›์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜

    2. ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ํฌ๊ธฐ๊ฐ€ 1์ด์–ด์•ผ ํ•จ.

  • ํฌ๊ธฐ๊ฐ€ 1์ธ ์ฐจ์›์€ ์ƒ๋Œ€๋ฐฉ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์— ๋งž์ถฐ ๋ณต์ œ(Stretch) ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์—ฌ ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    • ์ฐจ์› ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋” ์ ์€ ์ชฝ์˜ ์•ž์ชฝ(์™ผ์ชฝ)์— 1์„ ์ถ”๊ฐ€ํ•ด ์ฐจ์›์„ ๋งž์ถค.
    • ์กฐ๊ฑด์ด ๋งž์ง€ ์•Š์œผ๋ฉด ValueError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.ํฌ๊ธฐ๊ฐ€ 1์ธ ์ฐจ์›์€ ๋‹ค๋ฅธ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์— ๋งž์ถฐ ์ŠคํŠธ๋ ˆ์น˜(Stretch) ๋˜์–ด ์—ฐ์‚ฐ๋จ.

3. ๋ฐฐ์—ด์˜ ์ž๋ฃŒํ˜• (Data Types)

NumPy๋Š” C ์–ธ์–ด ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ํŒŒ์ด์ฌ๋ณด๋‹ค ๋” ์„ธ๋ถ„ํ™”๋œ ์ž๋ฃŒํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜์ž๋ฃŒํ˜• ์˜ˆ์‹œ
๋…ผ๋ฆฌํ˜•bool
์ •์ˆ˜ํ˜•int8, int16, int32, int64 (๋ถ€ํ˜ธ ์žˆ์Œ)
uint8, uint16, uint32, uint64 (๋ถ€ํ˜ธ ์—†์Œ, Unsigned)
์‹ค์ˆ˜ํ˜•float16, float32, float64
๋ณต์†Œ์ˆ˜ํ˜•complex64, complex128
๋ฌธ์ž์—ดstr_ (Unicode), bytes_
  • ์ฃผ์˜: int8์€ -128 ~ 127๊นŒ์ง€๋งŒ ์ €์žฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Overflow)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

4. ๋ฐฐ์—ด ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ ์˜ˆ์‹œ (Array Creation & Examples)

4.1 ๊ธฐ๋ณธ์ ์ธ ๋ฐฐ์—ด ์ƒ์„ฑ (List to Array)

๋‹ค์–‘ํ•œ ์ฐจ์›์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • Python ๋ฆฌ์ŠคํŠธ ๋ณ€ํ™˜: np.array([1, 2, 3])
import numpy as np

a1D = np.array([1, 2, 3, 4])
a2D = np.array([[1, 2], [3, 4]])
a3D = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

print("1D Array:", a1D)
print("2D Array:\n", a2D)
print("3D Array:\n", a3D)

(์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์œ„ ์ฝ”๋“œ ๋ธ”๋ก๊ณผ ๋™์ผ)

โš ๏ธ ์ฃผ์˜: OverflowError (๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ฒ”์œ„ ์ดˆ๊ณผ)

int8์€ -128 ~ 127 ๋ฒ”์œ„์˜ ์ •์ˆ˜๋งŒ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ”์œ„๋ฅผ ๋„˜๋Š” ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

# 128์€ int8์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚จ
print(np.array([126, 127, 128], dtype=np.int8))

Error: OverflowError: Python integer 128 out of bounds for int8

4.2 ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ (Unsigned Int ์ฃผ์˜)

  • int8: -128 ~ 127 ๋ฒ”์œ„. 128์„ ๋„ฃ์œผ๋ฉด Overflow ๋ฐœ์ƒ.
  • uint (Unsigned Integer, ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜): ์Œ์ˆ˜ ์—ฐ์‚ฐ ์‹œ Underflow๋กœ ์ธํ•ด ๋งค์šฐ ํฐ ์–‘์ˆ˜๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋จ.
a = np.array([2, 3, 4], dtype=np.uint32)
b = np.array([5, 6, 7], dtype=np.uint32)

c_unsigned32 = a - b
print('unsigned c:', c_unsigned32, c_unsigned32.dtype)
# ๊ฒฐ๊ณผ: [4294967293 4294967293 4294967293] uint32 (Underflow ๋ฐœ์ƒ!)

c_signed64 = a - b.astype(np.int32)
print('signed c:', c_signed64, c_signed64.dtype)
# ๊ฒฐ๊ณผ: [-3 -3 -3] int64 (์ •์ƒ์ ์ธ ์Œ์ˆ˜ ๊ฒฐ๊ณผ)

4.3 ๋‹ค์–‘ํ•œ ์ƒ์„ฑ ํ•จ์ˆ˜ (Intrinsic Creation)

NumPy๋Š” ํŠน์ • ํŒจํ„ด์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜ 40์—ฌ๊ฐœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ•™์  ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์“ฐ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์„ค๋ช…์˜ˆ์‹œํŠน์ง•
np.arange๋ฒ”์œ„ ๋‚ด ์ผ์ • ๊ฐ„๊ฒฉ์˜ ๊ฐ’ ์ƒ์„ฑnp.arange(10)ํŒŒ์ด์ฌ range์™€ ์œ ์‚ฌ
np.linspace๋ฒ”์œ„ ๋‚ด ๋“ฑ๊ฐ„๊ฒฉ์œผ๋กœ N๋“ฑ๋ถ„np.linspace(1, 4, 6)๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆด ๋•Œ ์œ ์šฉ
np.zeros0์œผ๋กœ ์ฑ„์šด ๋ฐฐ์—ดnp.zeros((2, 3))์ดˆ๊ธฐํ™”์šฉ
np.ones1๋กœ ์ฑ„์šด ๋ฐฐ์—ดnp.ones((2, 3))์ดˆ๊ธฐํ™”์šฉ
np.fullํŠน์ • ๊ฐ’์œผ๋กœ ์ฑ„์šด ๋ฐฐ์—ดnp.full((2, 3), 7)fill_value ์ง€์ •
np.empty์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’(์“ฐ๋ ˆ๊ธฐ๊ฐ’) ์ƒ์„ฑnp.empty((2, 3)) (๋น ๋ฆ„)๊ฐ€์žฅ ๋น ๋ฅด์ง€๋งŒ ์“ฐ๋ ˆ๊ธฐ๊ฐ’ ํฌํ•จ
np.eye๋‹จ์œ„ ํ–‰๋ ฌ (๋Œ€๊ฐ์„ ์ด 1)np.eye(3)์„ ํ˜•๋Œ€์ˆ˜์šฉ
np.diag๋Œ€๊ฐ ์„ฑ๋ถ„ ์ถ”์ถœ ๋˜๋Š” ์ƒ์„ฑnp.diag([1, 2])์„ ํ˜•๋Œ€์ˆ˜์šฉ(์˜ˆ, ๋ถ„์‚ฐ๊ฐ’ ์ถ”์ถœ, ๋‹ค์ค‘ํšŒ๊ท€๋ถ€์„ ๊ฐ€์ค‘์น˜)
np.arange(10)               # [0, 1, ..., 9]
np.arange(2, 10, dtype=float)
np.linspace(1., 4., 6)      # 1.0๋ถ€ํ„ฐ 4.0๊นŒ์ง€ ๋“ฑ๊ฐ„๊ฒฉ์œผ๋กœ 6๊ฐœ ์ƒ์„ฑ

np.eye(3)                   # 3x3 ๋‹จ์œ„ ํ–‰๋ ฌ
np.diag([1, 2, 3])          # ๋Œ€๊ฐ ํ–‰๋ ฌ ์ƒ์„ฑ

4.4 ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ (zeros, ones, full, empty)

  • np.empty: ์ดˆ๊ธฐํ™” ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋งŒ ํ• ๋‹น (๋งค์šฐ ๋น ๋ฅด์ง€๋งŒ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์ด ๋“ค์–ด์žˆ์Œ).
  • np.full: ์ง€์ •ํ•œ ๊ฐ’(fill_value)์œผ๋กœ ๋ฐฐ์—ด ์ฑ„์›€.
print(np.zeros((2, 3)))     # 0์œผ๋กœ ์ฑ„์›€
print(np.ones((2, 3)))      # 1๋กœ ์ฑ„์›€
print(np.full((2, 3), 7))   # 7๋กœ ์ฑ„์›€

โš ๏ธ ์ฃผ์˜: np.full ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ์—๋Ÿฌ

print(np.full((2, 3, 2), fill_value=[1, 2, 3]))

Error: ValueError: could not broadcast input array from shape (3,) into shape (2,3,2)

  • ์ด์œ : (2, 3, 2) ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ์‹ถ์€๋ฐ, ๋งˆ์ง€๋ง‰ ์ฐจ์›์˜ ํฌ๊ธฐ(2)์™€ ๋ฆฌ์ŠคํŠธ [1, 2, 3]์˜ ๊ธธ์ด(3)๊ฐ€ ๋งž์ง€ ์•Š์•„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

4.5 Random ๋ชจ๋“ˆ ์‚ฌ์šฉ

  • from numpy.random import default_rng
  • default_rng(seed).random((shape))ย ํ˜•ํƒœ๋กœ ๋‚œ์ˆ˜ ๋ฐฐ์—ด ์ƒ์„ฑ.
    • numpy.random.default_rng(seed).random()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์‹  ๊ถŒ์žฅ ๋ฐฉ์‹
  • seed๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜ด. ๋™์ผํ•œ ๊ฐ’์„ ์–ป๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ.

5. ๋ฐฐ์—ด ์กฐ์ž‘ (Manipulation)

5.1 ๋ณต์‚ฌ(Copy)์™€ ๋ทฐ(View)

NumPy์˜ ์Šฌ๋ผ์ด์‹ฑ์€ ๋ทฐ(View)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

  • View (์ฐธ์กฐ / ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ ): ์Šฌ๋ผ์ด์‹ฑํ•œ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜๋ฉด ์›๋ณธ ๋ฐฐ์—ด๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋จ.
    a = np.array([1, 2, 3, 4, 5, 6])
    b = a[:2]
    b += 1
    # ๊ฒฐ๊ณผ: a๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋จ ([2, 3, 3, 4, 5, 6])
  • Copy (๋ณต์ œ / ๋ณ„๋„ ๋ฉ”๋ชจ๋ฆฌ): .copy()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์•„ ์›๋ณธ์— ์˜ํ–ฅ ์—†์Œ.
    a = np.array([1, 2, 3, 4])
    b = a[:2].copy()
    b += 1
    # ๊ฒฐ๊ณผ: a๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ ([1, 2, 3, 4])

5.2 ๋ฐฐ์—ด ๊ฒฐํ•ฉ (Stacking)

์—ฌ๋Ÿฌ ๋ฐฐ์—ด์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • np.vstack (Vertical Stack): ์ˆ˜์ง(ํ–‰ ๋ฐฉํ–ฅ)์œผ๋กœ ์Œ“๊ธฐ
  • np.hstack (Horizontal Stack): ์ˆ˜ํ‰(์—ด ๋ฐฉํ–ฅ)์œผ๋กœ ์Œ“๊ธฐ
  • np.block: ๋ธ”๋ก ํ˜•ํƒœ๋กœ ์กฐ๋ฆฝํ•˜๊ธฐ
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.vstack((a, b))  # [[1, 2, 3], [4, 5, 6]]
np.hstack((a, b))  # [1, 2, 3, 4, 5, 6]

๐ŸงŠ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ Python: NumPy Part 2 ์‹ฌํ™”

1. ํŒŒ์ผ ์ž…์ถœ๋ ฅ (I/O) - Disk์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

1.1 ํ…์ŠคํŠธ/CSV ํŒŒ์ผ

  • np.loadtxt: ๋ฐ์ดํ„ฐ๊ฐ€ ๋น ์ง์—†์ด ์ฑ„์›Œ์ ธ ์žˆ๊ณ , ํƒ€์ž…์ด ์ผ์ •ํ•œ ์ •ํ˜•ํ™”๋œ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. (์ฃผ๋กœ float/int)
  • np.genfromtxt: ๊ฒฐ์ธก์น˜(Missing Values)๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋ณต์žกํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. delimiter๋กœ ๊ตฌ๋ถ„์ž๋ฅผ ์ง€์ •ํ•˜๊ณ , filling_values๋กœ ๊ฒฐ์ธก์น˜๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.2 ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ (JSON & Pickle)

  • np.save / np.load: NumPy ์ „์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋งท(.npy)์œผ๋กœ ์ €์žฅ/๋กœ๋“œ.
  • JSON: NumPy๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JSON ์ง๋ ฌํ™”(Serializable)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜(tolist())ํ•˜๊ฑฐ๋‚˜ json.JSONEncoder๋ฅผ ์ปค์Šคํ…€ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Pickle: ํŒŒ์ด์ฌ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด์ง€๋งŒ, ๋ณด์•ˆ ๋ฌธ์ œ์™€ ๋ฐ์ดํ„ฐ ์†์ƒ ์œ„ํ—˜์œผ๋กœ ์ธํ•ด ๊ฐ€๊ธ‰์  ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. np.save์™€ np.load๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ allow_pickle=False๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ (Indexing & Slicing)

2.1 ์ธ๋ฑ์‹ฑ (Indexing)

  • ๊ธฐ๋ณธ ์ธ๋ฑ์‹ฑ: x[0, 1, 2]์ฒ˜๋Ÿผ ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฐจ์›๋ณ„ ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
    • ์ธ๋ฑ์‹ฑ ํšจ์œจ์„ฑ: x[0, 1, 2] vs x[0][1][2] Argument Evaluation (์ธ์ž ํ‰๊ฐ€ ์‹œ์ )๋•Œ๋ฌธ์œผ๋กœ, ํŒŒ์ด์ฌ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ธ์ž(Argument)๋ฅผ ๋จผ์ € ํ‰๊ฐ€(Evaluation)ํ•œ ํ›„ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ์ง„์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ.
      • x[0, 1, 2] (๊ถŒ์žฅ): C์–ธ์–ด ๋ ˆ๋ฒจ์—์„œ ์ฆ‰์‹œ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
      • x[0][1][2] (๋น„๊ถŒ์žฅ):
        1. x[0]์„ ์‹คํ–‰ํ•˜์—ฌ ์ž„์‹œ ๋ฐฐ์—ด(View) ์ƒ์„ฑ.
        2. ๊ทธ ๊ฒฐ๊ณผ์—์„œ [1]์„ ์‹คํ–‰ํ•˜์—ฌ ๋˜ ์ž„์‹œ ๋ฐฐ์—ด ์ƒ์„ฑ.
        3. ๋งˆ์ง€๋ง‰์œผ๋กœ [2]๋ฅผ ์‹คํ–‰.
        • ๋ฌธ์ œ์ : ๋‹จ๊ณ„๋ณ„๋กœ ๋ถˆํ•„์š”ํ•œ ์ž„์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์—ฐ์‚ฐ ์†๋„ ๋ฉด์—์„œ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • ์Œ์ˆ˜ ์ธ๋ฑ์Šค: x[-1]์€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋ถ€ ์ธ๋ฑ์‹ฑ (Boolean Indexing): x[x % 2 == 0]๊ณผ ๊ฐ™์ด ์กฐ๊ฑด์‹(Mask)์„ ์‚ฌ์šฉํ•˜์—ฌ True์ธ ์š”์†Œ๋งŒ ์ถ”์ถœ(ํ•„ํ„ฐ๋ง)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.2 ์Šฌ๋ผ์ด์‹ฑ (Slicing) - ๋ทฐ(View)

  • ๊ตฌ์กฐ: start:stop:step (์˜ˆ: x[1:5:2])
  • Ellipsis (...): x[..., 0]์€ x[:, :, 0]๊ณผ ๊ฐ™์ด ๋‚˜๋จธ์ง€ ์ฐจ์›์„ ๋ชจ๋‘ ์„ ํƒํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ์ค‘์š”: NumPy์˜ ์Šฌ๋ผ์ด์‹ฑ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๋ทฐ(View)์ž…๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์‹ฑํ•œ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜๋ฉด ์›๋ณธ ๋ฐฐ์—ด๋„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. (๋ณต์‚ฌ๋ฅผ ์›ํ•˜๋ฉด .copy() ์‚ฌ์šฉ)

3. ๋ฐฐ์—ด ํ˜•ํƒœ ์กฐ์ž‘ (Shape Manipulation)

3.1 ํ˜•ํƒœ ๋ณ€๊ฒฝ (Reshape)

  • np.reshape(a, newshape): ๋ฐ์ดํ„ฐ์˜ ์ด ๊ฐœ์ˆ˜๊ฐ€ ์œ ์ง€๋˜๋Š” ํ•œ ๋ฐฐ์—ด์˜ ์ฐจ์›๊ณผ ๋ชจ์–‘์„ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • 1์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ฐจ์›์˜ ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ด ์ค๋‹ˆ๋‹ค. (์˜ˆ: reshape(2, -1))
  • np.flatten(): ํ‰ํƒ„ํ™”. ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์›์œผ๋กœ ์ญ‰ ํ…๋‹ˆ๋‹ค. (๋ณต์‚ฌ๋ณธ ๋ฐ˜ํ™˜)
  • np.ravel(): ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์›์œผ๋กœ ํ…๋‹ˆ๋‹ค. (๊ฐ€๋Šฅํ•˜๋ฉด ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ )

3.2 ์ถ• ๋ณ€๊ฒฝ (Transpose & Axes)

  • np.transpose(a) ๋˜๋Š” a.T: ํ–‰๊ณผ ์—ด์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค (์ „์น˜ ํ–‰๋ ฌ).
  • np.moveaxis(a, source, destination): ํŠน์ • ์ถ•์„ ์›ํ•˜๋Š” ์œ„์น˜๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.
  • np.swapaxes(a, axis1, axis2): ๋‘ ์ถ•์„ ์„œ๋กœ ๋งž๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

4. ์ง‘๊ณ„ ํ•จ์ˆ˜ (Aggregate function)

๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์•ฝํ•˜๋Š” ํ•จ์ˆ˜๋“ค๋กœ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์˜ ๊ณ„์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰์ž…๋‹ˆ๋‹ค. axis ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์„ค๋ช…
np.sumํ•ฉ๊ณ„
np.mean / np.stdํ‰๊ท  / ํ‘œ์ค€ํŽธ์ฐจ
np.min / np.max์ตœ์†Ÿ๊ฐ’ / ์ตœ๋Œ“๊ฐ’
np.argmax / np.argmin์ตœ๋Œ“๊ฐ’/์ตœ์†Ÿ๊ฐ’์˜ ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜
  • axis ๋งค๊ฐœ๋ณ€์ˆ˜: ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ถ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • axis=0: ์—ด(Column)๋ผ๋ฆฌ ์—ฐ์‚ฐ (์ˆ˜์ง ๋ฐฉํ–ฅ, ์„ธ๋กœ๋กœ ์••์ถ•)
    • axis=1: ํ–‰(Row)๋ผ๋ฆฌ ์—ฐ์‚ฐ (์ˆ˜ํ‰ ๋ฐฉํ–ฅ, ๊ฐ€๋กœ๋กœ ์••)
    • axis=None: ์ „์ฒด ์š”์†Œ ์—ฐ์‚ฐ

0๊ฐœ์˜ ๋Œ“๊ธ€