
list์ ๋ฌ๋ฆฌ, ๋์ผํ ๋ฐ์ดํฐ ํ์
(dtype)์ ๊ฐ์ง ์์๋ค๋ก ๊ตฌ์ฑ๋ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ ๊ณตํฉ๋๋ค.list๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์ฐจ์งํ๋ฉฐ ๋ฐ์ดํฐ๊ฐ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐฐ์น๋ฉ๋๋ค.(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] ๋ฑ ํ์ธ ํ์)๋ฐฐ์ด์ด๋ ํ๋ ฌ๊ณผ ๊ฐ์ ๋ค์ฐจ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํด ์์ ๋ณ ์ฐ์ฐ์ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
for ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋๋ฆผ.c = a * b์ ๊ฐ์ด ์์ฑํ๋ฉด ๊ฐ์ ์์น์ ์์๋ผ๋ฆฌ ๊ณฑ์
์ด ์ํ๋จ. (ํ๋ ฌ ๊ณฑ ์๋)์ฐจ์์ ํฌ๊ธฐ๊ฐ ๊ฐ๊ฑฐ๋
๋ ์ค ํ๋์ ํฌ๊ธฐ๊ฐ 1์ด์ด์ผ ํจ.

1์ธ ์ฐจ์์ ์๋๋ฐฉ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ๋ง์ถฐ ๋ณต์ (Stretch) ๋ ๊ฒ์ฒ๋ผ ๋์ํ์ฌ ์ฐ์ฐํฉ๋๋ค.ValueError๊ฐ ๋ฐ์ํฉ๋๋ค.ํฌ๊ธฐ๊ฐ 1์ธ ์ฐจ์์ ๋ค๋ฅธ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ๋ง์ถฐ ์คํธ๋ ์น(Stretch) ๋์ด ์ฐ์ฐ๋จ.NumPy๋ C ์ธ์ด ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฏ๋ก ํ์ด์ฌ๋ณด๋ค ๋ ์ธ๋ถํ๋ ์๋ฃํ์ ์ง์ํฉ๋๋ค.
| ๋ถ๋ฅ | ์๋ฃํ ์์ |
|---|---|
| ๋ ผ๋ฆฌํ | bool |
| ์ ์ํ | int8, int16, int32, int64 (๋ถํธ ์์)uint8, uint16, uint32, uint64 (๋ถํธ ์์, Unsigned) |
| ์ค์ํ | float16, float32, float64 |
| ๋ณต์์ํ | complex64, complex128 |
| ๋ฌธ์์ด | str_ (Unicode), bytes_ |
int8์ -128 ~ 127๊น์ง๋ง ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค. ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ฉด ์ค๋ฒํ๋ก์ฐ(Overflow)๊ฐ ๋ฐ์ํฉ๋๋ค.๋ค์ํ ์ฐจ์์ ๋ฐฐ์ด์ ์์ฑํ๋ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ์ ๋๋ค.
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)
(์คํ ๊ฒฐ๊ณผ๋ ์ ์ฝ๋ ๋ธ๋ก๊ณผ ๋์ผ)
int8์ -128 ~ 127 ๋ฒ์์ ์ ์๋ง ํํ ๊ฐ๋ฅํฉ๋๋ค. ์ด ๋ฒ์๋ฅผ ๋๋ ๊ฐ์ ํ ๋นํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
# 128์ int8์ ๋ฒ์๋ฅผ ๋ฒ์ด๋จ
print(np.array([126, 127, 128], dtype=np.int8))
Error: OverflowError: Python integer 128 out of bounds for int8
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 (์ ์์ ์ธ ์์ ๊ฒฐ๊ณผ)
NumPy๋ ํน์ ํจํด์ ๋ฐฐ์ด์ ๋ง๋๋ ๋ค์ํ ํจ์ 40์ฌ๊ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ํ์ ๊ณ์ฐ์ด ํ์ํ ์ํฉ์์ ์ฐ์ ๋๋ค.
| ํจ์ | ์ค๋ช | ์์ | ํน์ง |
|---|---|---|---|
np.arange | ๋ฒ์ ๋ด ์ผ์ ๊ฐ๊ฒฉ์ ๊ฐ ์์ฑ | np.arange(10) | ํ์ด์ฌ range์ ์ ์ฌ |
np.linspace | ๋ฒ์ ๋ด ๋ฑ๊ฐ๊ฒฉ์ผ๋ก N๋ฑ๋ถ | np.linspace(1, 4, 6) | ๊ทธ๋ํ ๊ทธ๋ฆด ๋ ์ ์ฉ |
np.zeros | 0์ผ๋ก ์ฑ์ด ๋ฐฐ์ด | np.zeros((2, 3)) | ์ด๊ธฐํ์ฉ |
np.ones | 1๋ก ์ฑ์ด ๋ฐฐ์ด | 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]) # ๋๊ฐ ํ๋ ฌ ์์ฑ
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๋ก ์ฑ์
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)๊ฐ ๋ง์ง ์์ ๋ธ๋ก๋์บ์คํ ์ ์คํจํ์ต๋๋ค.
numpy.random.default_rng(seed).random()์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ต์ ๊ถ์ฅ ๋ฐฉ์NumPy์ ์ฌ๋ผ์ด์ฑ์ ๋ทฐ(View)๋ฅผ ๋ฐํํฉ๋๋ค. ์ฆ, ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํฉ๋๋ค.
a = np.array([1, 2, 3, 4, 5, 6])
b = a[:2]
b += 1
# ๊ฒฐ๊ณผ: a๋ ํจ๊ป ๋ณ๊ฒฝ๋จ ([2, 3, 3, 4, 5, 6]).copy()๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์๋ณธ์ ์ํฅ ์์.a = np.array([1, 2, 3, 4])
b = a[:2].copy()
b += 1
# ๊ฒฐ๊ณผ: a๋ ๋ณ๊ฒฝ๋์ง ์์ ([1, 2, 3, 4])์ฌ๋ฌ ๋ฐฐ์ด์ ํ๋๋ก ํฉ์น๋ ๋ฐฉ๋ฒ์ ๋๋ค.
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]
np.loadtxt: ๋ฐ์ดํฐ๊ฐ ๋น ์ง์์ด ์ฑ์์ ธ ์๊ณ , ํ์
์ด ์ผ์ ํ ์ ํํ๋ ๋ฐ์ดํฐ์ ์ ํฉํฉ๋๋ค. (์ฃผ๋ก float/int)np.genfromtxt: ๊ฒฐ์ธก์น(Missing Values)๊ฐ ์๊ฑฐ๋ ๋ฐ์ดํฐ ํ์
์ด ๋ณต์กํ ๋ ์ ์ฉํฉ๋๋ค. delimiter๋ก ๊ตฌ๋ถ์๋ฅผ ์ง์ ํ๊ณ , filling_values๋ก ๊ฒฐ์ธก์น๋ฅผ ์ฑ์ธ ์ ์์ต๋๋ค.np.save / np.load: NumPy ์ ์ฉ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท(.npy)์ผ๋ก ์ ์ฅ/๋ก๋.tolist())ํ๊ฑฐ๋ json.JSONEncoder๋ฅผ ์ปค์คํ
ํ์ฌ ์ฌ์ฉํด์ผ ํฉ๋๋ค.np.save์ np.load๋ฅผ ์ฌ์ฉํ ๋ allow_pickle=False๋ก ์ค์ ํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.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] (๋น๊ถ์ฅ):x[0]์ ์คํํ์ฌ ์์ ๋ฐฐ์ด(View) ์์ฑ.[1]์ ์คํํ์ฌ ๋ ์์ ๋ฐฐ์ด ์์ฑ.[2]๋ฅผ ์คํ.x[-1]์ ๋ง์ง๋ง ์์๋ฅผ ์๋ฏธํฉ๋๋ค.x[x % 2 == 0]๊ณผ ๊ฐ์ด ์กฐ๊ฑด์(Mask)์ ์ฌ์ฉํ์ฌ True์ธ ์์๋ง ์ถ์ถ(ํํฐ๋ง)ํ ์ ์์ต๋๋ค.start:stop:step (์: x[1:5:2])x[..., 0]์ x[:, :, 0]๊ณผ ๊ฐ์ด ๋๋จธ์ง ์ฐจ์์ ๋ชจ๋ ์ ํํ๋ค๋ ์๋ฏธ์
๋๋ค..copy() ์ฌ์ฉ)np.reshape(a, newshape): ๋ฐ์ดํฐ์ ์ด ๊ฐ์๊ฐ ์ ์ง๋๋ ํ ๋ฐฐ์ด์ ์ฐจ์๊ณผ ๋ชจ์์ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํฉ๋๋ค.1์ ์ฌ์ฉํ๋ฉด ํด๋น ์ฐจ์์ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํด ์ค๋๋ค. (์: reshape(2, -1))np.flatten(): ํํํ. ๋ค์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ์ญ ํ
๋๋ค. (๋ณต์ฌ๋ณธ ๋ฐํ)np.ravel(): ๋ค์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ํ
๋๋ค. (๊ฐ๋ฅํ๋ฉด ๋ทฐ๋ฅผ ๋ฐํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ )np.transpose(a) ๋๋ a.T: ํ๊ณผ ์ด์ ๋ฐ๊ฟ๋๋ค (์ ์น ํ๋ ฌ).np.moveaxis(a, source, destination): ํน์ ์ถ์ ์ํ๋ ์์น๋ก ์ด๋์ํต๋๋ค.np.swapaxes(a, axis1, axis2): ๋ ์ถ์ ์๋ก ๋ง๋ฐ๊ฟ๋๋ค.๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์์ฝํ๋ ํจ์๋ค๋ก, ๋์ฉ๋ ๋ฐ์ดํฐ์ ๊ณ์ฐ์ ๋น ๋ฅด๊ฒ ์ํ์
๋๋ค. axis ํ๋ผ๋ฏธํฐ๊ฐ ํต์ฌ์
๋๋ค.
| ํจ์ | ์ค๋ช |
|---|---|
np.sum | ํฉ๊ณ |
np.mean / np.std | ํ๊ท / ํ์คํธ์ฐจ |
np.min / np.max | ์ต์๊ฐ / ์ต๋๊ฐ |
np.argmax / np.argmin | ์ต๋๊ฐ/์ต์๊ฐ์ ์ธ๋ฑ์ค ๋ฐํ |
axis ๋งค๊ฐ๋ณ์: ์ฐ์ฐ์ ์ํํ ์ถ์ ์ง์ ํฉ๋๋ค.axis=0: ์ด(Column)๋ผ๋ฆฌ ์ฐ์ฐ (์์ง ๋ฐฉํฅ, ์ธ๋ก๋ก ์์ถ)axis=1: ํ(Row)๋ผ๋ฆฌ ์ฐ์ฐ (์ํ ๋ฐฉํฅ, ๊ฐ๋ก๋ก ์)axis=None: ์ ์ฒด ์์ ์ฐ์ฐ