01_numpy_basics.py

Download
python 392 lines 11.6 KB
  1"""
  2NumPy ๊ธฐ์ดˆ (NumPy Basics)
  3Fundamental NumPy Operations
  4
  5NumPy๋Š” Python์˜ ํ•ต์‹ฌ ๊ณผํ•™ ์ปดํ“จํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  6"""
  7
  8import numpy as np
  9
 10
 11# =============================================================================
 12# 1. ๋ฐฐ์—ด ์ƒ์„ฑ
 13# =============================================================================
 14def array_creation():
 15    """๋‹ค์–‘ํ•œ ๋ฐฐ์—ด ์ƒ์„ฑ ๋ฐฉ๋ฒ•"""
 16    print("\n[1] ๋ฐฐ์—ด ์ƒ์„ฑ")
 17    print("=" * 50)
 18
 19    # ๋ฆฌ์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ
 20    arr1 = np.array([1, 2, 3, 4, 5])
 21    print(f"๋ฆฌ์ŠคํŠธ๋กœ๋ถ€ํ„ฐ: {arr1}")
 22
 23    # 2D ๋ฐฐ์—ด
 24    arr2d = np.array([[1, 2, 3], [4, 5, 6]])
 25    print(f"2D ๋ฐฐ์—ด:\n{arr2d}")
 26
 27    # ํŠน์ˆ˜ ๋ฐฐ์—ด
 28    zeros = np.zeros((3, 4))  # 0์œผ๋กœ ์ฑ„์›€
 29    ones = np.ones((2, 3))    # 1๋กœ ์ฑ„์›€
 30    empty = np.empty((2, 2))  # ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด
 31    full = np.full((2, 3), 7) # ํŠน์ • ๊ฐ’์œผ๋กœ ์ฑ„์›€
 32    eye = np.eye(3)           # ๋‹จ์œ„ ํ–‰๋ ฌ
 33
 34    print(f"\nnp.zeros((3,4)):\n{zeros}")
 35    print(f"\nnp.eye(3):\n{eye}")
 36
 37    # ์ˆ˜์—ด ์ƒ์„ฑ
 38    arange = np.arange(0, 10, 2)  # start, stop, step
 39    linspace = np.linspace(0, 1, 5)  # start, stop, num
 40    logspace = np.logspace(0, 3, 4)  # 10^0 ~ 10^3
 41
 42    print(f"\nnp.arange(0, 10, 2): {arange}")
 43    print(f"np.linspace(0, 1, 5): {linspace}")
 44    print(f"np.logspace(0, 3, 4): {logspace}")
 45
 46    # ๋‚œ์ˆ˜ ๋ฐฐ์—ด
 47    rand = np.random.rand(3, 3)        # ๊ท ์ผ ๋ถ„ํฌ [0, 1)
 48    randn = np.random.randn(3, 3)      # ํ‘œ์ค€ ์ •๊ทœ ๋ถ„ํฌ
 49    randint = np.random.randint(0, 10, (3, 3))  # ์ •์ˆ˜
 50
 51    print(f"\nnp.random.rand(3,3):\n{rand}")
 52
 53
 54# =============================================================================
 55# 2. ๋ฐฐ์—ด ์†์„ฑ๊ณผ ํ˜•ํƒœ ๋ณ€ํ™˜
 56# =============================================================================
 57def array_attributes():
 58    """๋ฐฐ์—ด ์†์„ฑ ๋ฐ ํ˜•ํƒœ ๋ณ€ํ™˜"""
 59    print("\n[2] ๋ฐฐ์—ด ์†์„ฑ๊ณผ ํ˜•ํƒœ ๋ณ€ํ™˜")
 60    print("=" * 50)
 61
 62    arr = np.array([[1, 2, 3], [4, 5, 6]])
 63
 64    print(f"๋ฐฐ์—ด:\n{arr}")
 65    print(f"shape: {arr.shape}")      # (2, 3)
 66    print(f"ndim: {arr.ndim}")        # ์ฐจ์› ์ˆ˜
 67    print(f"size: {arr.size}")        # ์ „์ฒด ์š”์†Œ ์ˆ˜
 68    print(f"dtype: {arr.dtype}")      # ๋ฐ์ดํ„ฐ ํƒ€์ž…
 69
 70    # ํ˜•ํƒœ ๋ณ€ํ™˜
 71    reshaped = arr.reshape(3, 2)
 72    print(f"\nreshape(3, 2):\n{reshaped}")
 73
 74    flattened = arr.flatten()
 75    print(f"flatten(): {flattened}")
 76
 77    raveled = arr.ravel()
 78    print(f"ravel(): {raveled}")
 79
 80    # ์ „์น˜
 81    transposed = arr.T
 82    print(f"\n์ „์น˜ (T):\n{transposed}")
 83
 84    # ์ฐจ์› ์ถ”๊ฐ€/์ œ๊ฑฐ
 85    arr1d = np.array([1, 2, 3])
 86    expanded = np.expand_dims(arr1d, axis=0)  # (3,) -> (1, 3)
 87    print(f"\nexpand_dims: {arr1d.shape} -> {expanded.shape}")
 88
 89    squeezed = np.squeeze(expanded)
 90    print(f"squeeze: {expanded.shape} -> {squeezed.shape}")
 91
 92
 93# =============================================================================
 94# 3. ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ
 95# =============================================================================
 96def indexing_slicing():
 97    """์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ"""
 98    print("\n[3] ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ")
 99    print("=" * 50)
100
101    arr = np.array([[1, 2, 3, 4],
102                    [5, 6, 7, 8],
103                    [9, 10, 11, 12]])
104
105    print(f"์›๋ณธ ๋ฐฐ์—ด:\n{arr}")
106
107    # ๊ธฐ๋ณธ ์ธ๋ฑ์‹ฑ
108    print(f"\narr[0, 0] = {arr[0, 0]}")  # ์ฒซ ๋ฒˆ์งธ ์š”์†Œ
109    print(f"arr[1, 2] = {arr[1, 2]}")    # 7
110    print(f"arr[-1, -1] = {arr[-1, -1]}")  # ๋งˆ์ง€๋ง‰ ์š”์†Œ
111
112    # ์Šฌ๋ผ์ด์‹ฑ
113    print(f"\narr[0, :] = {arr[0, :]}")    # ์ฒซ ๋ฒˆ์งธ ํ–‰
114    print(f"arr[:, 0] = {arr[:, 0]}")      # ์ฒซ ๋ฒˆ์งธ ์—ด
115    print(f"arr[0:2, 1:3] =\n{arr[0:2, 1:3]}")  # ๋ถ€๋ถ„ ๋ฐฐ์—ด
116
117    # ํŒฌ์‹œ ์ธ๋ฑ์‹ฑ
118    indices = [0, 2]
119    print(f"\narr[indices] =\n{arr[indices]}")  # 0, 2๋ฒˆ์งธ ํ–‰
120
121    # ๋ถˆ๋ฆฌ์•ˆ ์ธ๋ฑ์‹ฑ
122    mask = arr > 5
123    print(f"\nmask (arr > 5):\n{mask}")
124    print(f"arr[arr > 5] = {arr[arr > 5]}")
125
126
127# =============================================================================
128# 4. ๋ฐฐ์—ด ์—ฐ์‚ฐ
129# =============================================================================
130def array_operations():
131    """๋ฐฐ์—ด ์—ฐ์‚ฐ๊ณผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…"""
132    print("\n[4] ๋ฐฐ์—ด ์—ฐ์‚ฐ")
133    print("=" * 50)
134
135    a = np.array([[1, 2], [3, 4]])
136    b = np.array([[5, 6], [7, 8]])
137
138    print(f"a =\n{a}")
139    print(f"b =\n{b}")
140
141    # ์š”์†Œ๋ณ„ ์—ฐ์‚ฐ
142    print(f"\na + b =\n{a + b}")
143    print(f"a * b =\n{a * b}")    # ์š”์†Œ๋ณ„ ๊ณฑ์…ˆ
144    print(f"a / b =\n{a / b}")
145    print(f"a ** 2 =\n{a ** 2}")
146
147    # ํ–‰๋ ฌ ์—ฐ์‚ฐ
148    print(f"\na @ b (ํ–‰๋ ฌ ๊ณฑ) =\n{a @ b}")
149    print(f"np.dot(a, b) =\n{np.dot(a, b)}")
150
151    # ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…
152    print("\n[๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…]")
153    arr = np.array([[1, 2, 3], [4, 5, 6]])
154    scalar = 10
155    row_vec = np.array([1, 0, 1])
156    col_vec = np.array([[10], [20]])
157
158    print(f"arr + scalar =\n{arr + scalar}")
159    print(f"arr * row_vec =\n{arr * row_vec}")
160    print(f"arr + col_vec =\n{arr + col_vec}")
161
162
163# =============================================================================
164# 5. ์ˆ˜ํ•™ ํ•จ์ˆ˜
165# =============================================================================
166def math_functions():
167    """์ˆ˜ํ•™ ํ•จ์ˆ˜"""
168    print("\n[5] ์ˆ˜ํ•™ ํ•จ์ˆ˜")
169    print("=" * 50)
170
171    arr = np.array([1, 4, 9, 16, 25])
172    print(f"arr = {arr}")
173
174    # ๊ธฐ๋ณธ ์ˆ˜ํ•™ ํ•จ์ˆ˜
175    print(f"\nnp.sqrt(arr) = {np.sqrt(arr)}")
176    print(f"np.exp(arr[:3]) = {np.exp(arr[:3])}")
177    print(f"np.log(arr) = {np.log(arr)}")
178
179    # ์‚ผ๊ฐ ํ•จ์ˆ˜
180    angles = np.array([0, np.pi/6, np.pi/4, np.pi/3, np.pi/2])
181    print(f"\nangles = {np.degrees(angles)}")
182    print(f"np.sin(angles) = {np.sin(angles)}")
183
184    # ๋ฐ˜์˜ฌ๋ฆผ
185    float_arr = np.array([1.2, 2.5, 3.7, -1.2])
186    print(f"\nfloat_arr = {float_arr}")
187    print(f"np.round(float_arr) = {np.round(float_arr)}")
188    print(f"np.floor(float_arr) = {np.floor(float_arr)}")
189    print(f"np.ceil(float_arr) = {np.ceil(float_arr)}")
190
191
192# =============================================================================
193# 6. ์ง‘๊ณ„ ํ•จ์ˆ˜
194# =============================================================================
195def aggregation_functions():
196    """์ง‘๊ณ„ ํ•จ์ˆ˜"""
197    print("\n[6] ์ง‘๊ณ„ ํ•จ์ˆ˜")
198    print("=" * 50)
199
200    arr = np.array([[1, 2, 3],
201                    [4, 5, 6],
202                    [7, 8, 9]])
203
204    print(f"๋ฐฐ์—ด:\n{arr}")
205
206    # ์ „์ฒด ์ง‘๊ณ„
207    print(f"\nnp.sum(arr) = {np.sum(arr)}")
208    print(f"np.mean(arr) = {np.mean(arr)}")
209    print(f"np.std(arr) = {np.std(arr):.4f}")
210    print(f"np.min(arr) = {np.min(arr)}")
211    print(f"np.max(arr) = {np.max(arr)}")
212
213    # ์ถ•๋ณ„ ์ง‘๊ณ„
214    print(f"\nnp.sum(arr, axis=0) = {np.sum(arr, axis=0)}")  # ์—ด ํ•ฉ
215    print(f"np.sum(arr, axis=1) = {np.sum(arr, axis=1)}")    # ํ–‰ ํ•ฉ
216    print(f"np.mean(arr, axis=0) = {np.mean(arr, axis=0)}")
217
218    # ๋ˆ„์ 
219    print(f"\nnp.cumsum(arr.flatten()) = {np.cumsum(arr.flatten())}")
220
221    # ์œ„์น˜ ์ฐพ๊ธฐ
222    print(f"\nnp.argmax(arr) = {np.argmax(arr)}")  # ํ‰ํƒ„ํ™”๋œ ์ธ๋ฑ์Šค
223    print(f"np.argmin(arr) = {np.argmin(arr)}")
224
225
226# =============================================================================
227# 7. ๋ฐฐ์—ด ์กฐ์ž‘
228# =============================================================================
229def array_manipulation():
230    """๋ฐฐ์—ด ์กฐ์ž‘"""
231    print("\n[7] ๋ฐฐ์—ด ์กฐ์ž‘")
232    print("=" * 50)
233
234    # ์—ฐ๊ฒฐ
235    a = np.array([[1, 2], [3, 4]])
236    b = np.array([[5, 6], [7, 8]])
237
238    print(f"a =\n{a}")
239    print(f"b =\n{b}")
240
241    vstack = np.vstack([a, b])  # ์ˆ˜์ง ์—ฐ๊ฒฐ
242    hstack = np.hstack([a, b])  # ์ˆ˜ํ‰ ์—ฐ๊ฒฐ
243    concat = np.concatenate([a, b], axis=0)
244
245    print(f"\nvstack:\n{vstack}")
246    print(f"\nhstack:\n{hstack}")
247
248    # ๋ถ„ํ• 
249    arr = np.arange(16).reshape(4, 4)
250    print(f"\n๋ถ„ํ•  ๋Œ€์ƒ:\n{arr}")
251
252    vsplit = np.vsplit(arr, 2)
253    hsplit = np.hsplit(arr, 2)
254
255    print(f"\nvsplit(2):\n{vsplit[0]}\n{vsplit[1]}")
256
257    # ์ •๋ ฌ
258    unsorted = np.array([3, 1, 4, 1, 5, 9, 2, 6])
259    print(f"\n์ •๋ ฌ ์ „: {unsorted}")
260    print(f"np.sort(): {np.sort(unsorted)}")
261    print(f"np.argsort(): {np.argsort(unsorted)}")  # ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค
262
263
264# =============================================================================
265# 8. ์„ ํ˜• ๋Œ€์ˆ˜
266# =============================================================================
267def linear_algebra():
268    """์„ ํ˜• ๋Œ€์ˆ˜ ์—ฐ์‚ฐ"""
269    print("\n[8] ์„ ํ˜• ๋Œ€์ˆ˜")
270    print("=" * 50)
271
272    A = np.array([[1, 2], [3, 4]])
273    b = np.array([5, 6])
274
275    print(f"A =\n{A}")
276    print(f"b = {b}")
277
278    # ํ–‰๋ ฌ์‹
279    det = np.linalg.det(A)
280    print(f"\nํ–‰๋ ฌ์‹ det(A) = {det:.4f}")
281
282    # ์—ญํ–‰๋ ฌ
283    A_inv = np.linalg.inv(A)
284    print(f"\n์—ญํ–‰๋ ฌ A^(-1) =\n{A_inv}")
285
286    # ์„ ํ˜• ์‹œ์Šคํ…œ ํ’€๊ธฐ: Ax = b
287    x = np.linalg.solve(A, b)
288    print(f"\nAx = b์˜ ํ•ด x = {x}")
289    print(f"๊ฒ€์ฆ A @ x = {A @ x}")
290
291    # ๊ณ ์œ ๊ฐ’/๊ณ ์œ ๋ฒกํ„ฐ
292    eigenvalues, eigenvectors = np.linalg.eig(A)
293    print(f"\n๊ณ ์œ ๊ฐ’: {eigenvalues}")
294    print(f"๊ณ ์œ ๋ฒกํ„ฐ:\n{eigenvectors}")
295
296    # ํŠน์ด๊ฐ’ ๋ถ„ํ•ด (SVD)
297    U, S, Vt = np.linalg.svd(A)
298    print(f"\nSVD:")
299    print(f"U =\n{U}")
300    print(f"S = {S}")
301    print(f"Vt =\n{Vt}")
302
303
304# =============================================================================
305# 9. ์‹ค์ „ ์˜ˆ์ œ
306# =============================================================================
307def practical_examples():
308    """์‹ค์ „ ์˜ˆ์ œ"""
309    print("\n[9] ์‹ค์ „ ์˜ˆ์ œ")
310    print("=" * 50)
311
312    # ์˜ˆ์ œ 1: ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ
313    print("\n์˜ˆ์ œ 1: ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ")
314    point1 = np.array([1, 2, 3])
315    point2 = np.array([4, 5, 6])
316    distance = np.linalg.norm(point1 - point2)
317    print(f"์ 1: {point1}, ์ 2: {point2}")
318    print(f"๊ฑฐ๋ฆฌ: {distance:.4f}")
319
320    # ์˜ˆ์ œ 2: ์ด๋™ ํ‰๊ท 
321    print("\n์˜ˆ์ œ 2: ์ด๋™ ํ‰๊ท ")
322    data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
323    window = 3
324    moving_avg = np.convolve(data, np.ones(window)/window, mode='valid')
325    print(f"๋ฐ์ดํ„ฐ: {data}")
326    print(f"์ด๋™ ํ‰๊ท  (window={window}): {moving_avg}")
327
328    # ์˜ˆ์ œ 3: ์ •๊ทœํ™”
329    print("\n์˜ˆ์ œ 3: ์ •๊ทœํ™”")
330    data = np.array([10, 20, 30, 40, 50])
331    normalized = (data - data.mean()) / data.std()
332    min_max = (data - data.min()) / (data.max() - data.min())
333    print(f"์›๋ณธ: {data}")
334    print(f"Z-score: {normalized}")
335    print(f"Min-Max: {min_max}")
336
337    # ์˜ˆ์ œ 4: ํ–‰๋ ฌ ๋ฐฉ์ •์‹
338    print("\n์˜ˆ์ œ 4: ์—ฐ๋ฆฝ๋ฐฉ์ •์‹ ํ’€๊ธฐ")
339    # 2x + 3y = 8
340    # 3x + 4y = 11
341    A = np.array([[2, 3], [3, 4]])
342    b = np.array([8, 11])
343    solution = np.linalg.solve(A, b)
344    print(f"2x + 3y = 8")
345    print(f"3x + 4y = 11")
346    print(f"ํ•ด: x = {solution[0]:.4f}, y = {solution[1]:.4f}")
347
348
349# =============================================================================
350# ๋ฉ”์ธ
351# =============================================================================
352def main():
353    print("=" * 60)
354    print("NumPy ๊ธฐ์ดˆ ์˜ˆ์ œ")
355    print("=" * 60)
356
357    array_creation()
358    array_attributes()
359    indexing_slicing()
360    array_operations()
361    math_functions()
362    aggregation_functions()
363    array_manipulation()
364    linear_algebra()
365    practical_examples()
366
367    print("\n" + "=" * 60)
368    print("NumPy ํ•ต์‹ฌ ์ •๋ฆฌ")
369    print("=" * 60)
370    print("""
371    ํ•ต์‹ฌ ๊ฐœ๋…:
372    - ndarray: N์ฐจ์› ๋ฐฐ์—ด (ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ)
373    - ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…: ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋ฐฐ์—ด ๊ฐ„ ์—ฐ์‚ฐ
374    - ๋ฒกํ„ฐํ™”: ๋ฃจํ”„ ์—†์ด ๋น ๋ฅธ ์—ฐ์‚ฐ
375
376    ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜:
377    - ์ƒ์„ฑ: array, zeros, ones, arange, linspace
378    - ํ˜•ํƒœ: reshape, flatten, T
379    - ์ง‘๊ณ„: sum, mean, std, min, max
380    - ์—ฐ์‚ฐ: +, -, *, /, @, dot
381    - ์„ ํ˜•๋Œ€์ˆ˜: linalg.inv, linalg.solve, linalg.eig
382
383    ํŒ:
384    - ๋ฃจํ”„ ๋Œ€์‹  ๋ฒกํ„ฐํ™” ์—ฐ์‚ฐ ์‚ฌ์šฉ (ํ›จ์”ฌ ๋น ๋ฆ„)
385    - axis ๋งค๊ฐœ๋ณ€์ˆ˜ ์ดํ•ดํ•˜๊ธฐ (0=ํ–‰ ๋ฐฉํ–ฅ, 1=์—ด ๋ฐฉํ–ฅ)
386    - ๋ณต์‚ฌ vs ๋ทฐ ๊ตฌ๋ถ„ํ•˜๊ธฐ (copy() vs ์Šฌ๋ผ์ด์‹ฑ)
387    """)
388
389
390if __name__ == "__main__":
391    main()