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()