Numerical Python
์์น์ฐ์ฐ ๋ฐ ๋ฒกํฐ ์ฐ์ฐ์ ์ต์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ต์ ํ๋ C code๋ก ๊ตฌํ โ ์ข์ ์ฑ๋ฅ
ํ์ด์ฌ๊ณผ ๋ฌ๋ฆฌ, ์์น ์ฐ์ฐ์ ์์ ์ฑ ๋ณด์ฅ(numerical stable)
โ
Numpy์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ์ ์ธ ์๋ฃ๊ตฌ์กฐ
python ๋ฆฌ์คํธ์ ๋น์ทํ๋, ์๋์ ๊ฐ์ ์ฐจ์ด์ ์ด ์๋ค.
- ์ ์ธํ ์ดํ ํฌ๊ธฐ ๋ณ๊ฒฝ ๋ถ๊ฐ
- ๋ชจ๋ ์์์ ๋ฐ์ดํฐ ํ์ ๋์ผ
- numpy array๋ผ๋ฆฌ ์ฐ์ฐ ๊ฐ๋ฅ(python ๋ฆฌ์คํธ๋ ๋ง์ ๋ง ๊ฐ๋ฅ)
- numpy array ์ ์ฒด์ ์ฐ์ฐ ๊ฐ๋ฅ(python ๋ฆฌ์คํธ๋ ๊ณฑ์ ๋ง ๊ฐ๋ฅ)
๊ฐ ์ฐจ์์ ์ถ(axis)์ด๋ผ๊ณ ํํ
์ถ์ฒ: https://www.pythontutorial.net/python-numpy/what-is-numpy/
โ
!pip install numpy==1.23.5
import numpy as np
np.__version__
np.array([[1, 2],[3, 4]]) # ๋ฆฌ์คํธ๋ฅผ ์
๋ ฅ์ผ๋ก array ์์ฑ
np.array((1, 2, 3)) # ํํ์ ์
๋ ฅ์ผ๋ก array ์์ฑ
โ
np.zeros(5, dtype=int) # 5๊ฐ 0(์ ์)์ด ๋ด๊ธด array ์์ฑ
np.zeros((3, 4)) # 0(์ค์)์ผ๋ก ์ฑ์์ง (3, 4) ํฌ๊ธฐ์ array ์์ฑ
โ
np.ones(7, dtype=int) # 7๊ฐ 1(์ ์)์ด ๋ด๊ธด array ์์ฑ
np.ones((2, 3, 4), dtype=np.int64) # 1(์ ์)๋ก ์ฑ์์ง (2,3,4) ํฌ๊ธฐ array
โ
np.empty(4) # 4๊ฐ์ ์๋ฌด ๋ฐ์ดํฐ๊ฐ ๋ด๊ธด array
np.empty((2, 3)) # ์ด๊ธฐํ ๋์ง ์์ (2,3) ํฌ๊ธฐ์ array
โ
np.full(5, 2) # 2๊ฐ 5๊ฐ ์๋ array ์์ฑ
np.random.random(3) # 3๊ฐ์ ๋๋คํ ์ ๋ด๊ธด array
โ
# ์ฐ์์ ์ธ ๋ฐ์ดํฐ ๋ด๊ธด array ์์ฑ
np.arange(0, 10, 2) # 0์ด์ 10๋ฏธ๋ง ์ ์ 5์ฉ ์ฐจ์ด๋๊ฒ array ์์ฑ
np.arange(3) # 0~3 ์ ์ ๋ด๊ธด array ์์ฑ
np.linspace(0, 49, 50) # 0~49๊น์ง์ ๋ฒ์๋ฅผ 50๊ฐ๋ก ์๋ผ array ์์ฑ
np.linspace(0, 49) # ์์ ๋์ผ(3๋ฒ์งธ ์ธ์ ๋ํดํธ 50)
np.arange : ๊ฐ๊ฒฉ ๊ฐ์กฐํ ๋ ์ฌ์ฉ
np.arange(0, 1+0.25, 0.25) # ๊ฐ๋ ์ฑ์ ์ํด์ 1.25๋ฅผ 1+0.25๋ก ํํ!
np.linspace : ๊ฐ์ ๊ฐ์กฐํ ๋ ์ฌ์ฉ
np.linspace(0, 1, 5) # 0๋ถํฐ 1๊น์ง(๋ ๊ฐ ํฌํจ) 5๋ฑ๋ถ(๊ฒฐ๊ณผ๋ ์์ ๋์ผ)
v1 @ v2
arr1 < 35
โ
filter = np.where(arr1 > 4) # ๊ดํธ ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ True์ธ ์์์ ์ธ๋ฑ์ค ๋ด๊ธด array
arr1 = np.array([1, 0, 0]) # 1d array
arr2 = np.array([[1, 2, 3],
[4, 5, 6]]) # 2d array
arr1 + arr2 # ๊ฐ์ ์ฐจ์์ ๊ธฐ์ค์ผ๋ก ๋ํด์ค(๊ฒฐ๊ณผ : 2์ฐจ์)
# [arr1 + arr2[0], arr1 + arr2[1]]
arr = np.array([1., 2., 3., 4.])
arr + 2 # f = lambda x : x + 2
๐ฅ TIP) ๋ฐฐ์ด์ shape ๊ณ์ฐํ๊ธฐ
- ์์ ๋๊ดํธ( [ ) ๊ฐ์๋ก ์ฐจ์ ํ์ธ(n)
- ์ฒซ๋ฒ์งธ ๋๊ดํธ ์์ ๋ด๊ธด ์์(๋๋ ๋๊ดํธ) ์ ์ธ๊ธฐ(a)
- ๊ทธ ๋ค์ ๋๊ดํธ ์์ ๋ด๊ธด ์์(๋๋ ๋๊ดํธ) ์ ์ธ๊ธฐ(b)
- ์ ๊ณผ์ (n๋ฒ) ๋ฐ๋ณตํ์ฌ shape ๊ณ์ฐํ๊ธฐ(a,b,...)
- Fancy Indexingยถ
- Numpy array[row์ ๋ํ ์กฐ๊ฑด, column์ ๋ํ ์กฐ๊ฑด]
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) โ # arr์ 2row, 3column ์์ ์ธ๋ฑ์ฑ arr[1, 2] # ํ๋ ฌ๊ณผ ๊ฐ์ ๋ ธํ ์ด์ (ํ๊ธฐ๋ฒ) # arr2[1][2] >> ๋ฆฌ์คํธ ์ธ๋ฑ์ฑ ๊ฐ๋ฅ arr[[0, 1, 2], 2] # arr์ ์ธ๋ฒ์งธ column arr[:, 2] # ์์ ๋์ผ โ # arr์ ๋๋ฒ์งธ column์ค์์ 6๋ณด๋ค ํฐ ์์๋ค ์ฐพ๊ธฐ mask = arr2[:,1] > 6 arr2[:,1][mask] arr2[mask, 1] # ์์ ๋์ผ โ arr[arr[:, 0] > 8] # row์ ๋ํ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ฑ >> 3ํ ์ ๋ถ ์ถ๋ ฅ
โ
np.random.seed(42)
# ํ์ค์ ๊ท๋ถํฌ์์ ์์๋ฅผ random samplingํ์ฌ 5x3 ํ๋ ฌ ์์ฑ
mat1 = np.random.randn(5, 3)
np.abs(mat1) # mat1์ ์ ๋๊ฐ
np.square(mat1) # mat1 ์ ๊ณฑ
np.sqrt(mat1) # mat1์ ์ ๊ณฑ๊ทผ
np.add(A, 2) # ๋ํ๊ธฐ
np.subtract(A, B) # ๋นผ๊ธฐ
np.multiply(A, B) # ๊ณฑํ๊ธฐ
np.divide(A, B) # ๋๋๊ธฐ
np.random.seed(42)
mat2 = np.random.rand(3, 2) # 0~1์ฌ์ด ๊ท ๋ฑ๋ถํฌ ์ด๋ฃจ๋ ์์ ๋ด๊ธด ํ๋ ฌ ์์ฑ
np.sum(mat2, axis=1) # ํฉ๊ณ
mat2.sum() # ํฉ๊ณ
np.mean(mat2, axis=0) # ํ๊ท
mat2.mean() # ํ๊ท
np.std(mat2) # ํ์คํธ์ฐจ
mat2.std() # ํ์คํธ์ฐจ
np.var(mat2) # ๋ถ์ฐ
mat2.var() # ๋ถ์ฐ
np.min(mat2, axis=1) # ์ต์๊ฐ
mat2.min() # ์ต์๊ฐ
np.max(mat2, axis=0) # ์ต๋๊ฐ
mat2.max() # ์ต๋๊ฐ
np.median(mat2) # ์ค์๊ฐ(numpy array์ ๋ฉ์๋ X)
np.argmin(mat2, axis=1) # ์ต์๊ฐ์ด ์๋ Index ๐๐๐
mat2.argmin() # ์ต์๊ฐ์ด ์๋ Index ๐๐๐
np.argmax(mat2, axis=0) # ์ต๋๊ฐ์ด ์๋ Index ๐๐๐
mat2.argmax() # ์ต๋๊ฐ์ด ์๋ Index ๐๐๐
mat2.cumsum() # ๋์ ํฉ
๐ฅ TIP) ์ง๊ณํจ์์ ๋งค๊ฐ๋ณ์ axis(์ถ ๊ธฐ์ค ์ฐ์ฐ)
- axis=0 : ํ ๊ธฐ์ค
ex) np.sum(mat2, axis=0)
ํ ๊ธฐ์ค์ผ๋ก ๋ํ๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ณผ์ ์ผ๋ก ์ธ๋ก๋ฐฉํฅ์ผ๋ก ๋ํ๋ค- axis=1 : ์ด ๊ธฐ์ค
ex) np.sum(mat2, axis=1)
์ด ๊ธฐ์ค์ผ๋ก ๋ํ๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋ก๋ฐฉํฅ์ผ๋ก ๋ํ๋ค
np.sort(mat2, axis=0) # ์ ๋ ฌ (์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ง ๊ฐ๋ฅ)
np.argsort(mat2, axis=0) # ์ ๋ ฌ ํ ์๋ณธ ๋ฐ์ดํฐ index ์ถ๋ ฅ
โ
arr = np.array([[1, 2],[3, 4]])
arr.shape # numpy array ๊ฐ ์ถ์ ํฌ๊ธฐ
arr.ndim # ์ถ์ ๊ฐ์
arr.dtype # ๊ฐ ์์์ ํ์
arr.itemsize # ๊ฐ ์์ ํ์
์ bytes ํฌ๊ธฐ
arr.size # ์ ์ฒด ์์์ ๊ฐ์
โ
a = np.arange(10)**2
a[2] # a ๋ฐฐ์ด์ 2๋ฒ์งธ ์ธ๋ฑ์ค ์ถ๋ ฅ
a[::-1] # reverse : ๋ฐฐ์ด์ ์์ ๊ฑฐ๊พธ๋ก ์ถ๋ ฅ
a[0:6:2] = 1000 # ์ธ๋ฑ์ค 0, 2, 4 ํด๋นํ๋ ๊ฐ์ 1000 ์ฝ์
a = np.arange(8)**2 # a = [ 0 1 4 9 16 25 36 49]
i = np.array([1, 1, 3, 5])
a[i] # [ 1 1 9 25] ์ถ๋ ฅ
j = np.array([[3, 4], [2, 5]])
a[j] # [[ 9 16] [ 4 25]] ์ถ๋ ฅ
a = np.arange(12).reshape(3,4) # [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] ์ถ๋ ฅ
b = a > 4 # [[False False False False][False True True True][ True True True True]]
a[b] # [ 5 6 7 8 9 10 11] ์ถ๋ ฅ
a[b].shape # (7,) ์ถ๋ ฅ
โ
a.ravel() # 1์ฐจ์์ผ๋ก ๋ณ๊ฒฝ
a.reshape(-1) # ์์ ๋์ผ
a.reshape(2, 6) # ์ง์ ํ ์ฐจ์ (2, 6)์ผ๋ก ๋ณ๊ฒฝ
a.T # ์ ์น [[ 0 4 8][ 1 5 9][ 2 6 10][ 3 7 11]] โ ์ฐจ์ (4,3)์ผ๋ก ๋ณ๊ฒฝ
โ
np.vstack(): axis=0(ํ ๊ธฐ์ค)์ผ๋ก ํฉ์น๊ธฐ
np.hstack(): axis=1(์ด ๊ธฐ์ค)์ผ๋ก ํฉ์น๊ธฐ
a = np.array([1, 2, 3, 4]).reshape(2, 2) b = np.array([5, 6, 7, 8]).reshape(2, 2) np.vstack((a, b)) np.hstack((a, b))
์ถ์ฒ : https://www.pythontutorial.net/python-numpy/numpy-vstack/
์ถ์ฒ : https://www.pythontutorial.net/python-numpy/numpy-hstack/
โ
a = np.arange(12).reshape(2, 6) # [[ 0 1 2 3 4 5][ 6 7 8 9 10 11]]
np.hsplit(a, 3) # axis=1 ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ 3๋ฑ๋ถ
# [array([[0, 1],[6, 7]]),array([[2, 3],[8, 9]]),array([[ 4, 5],[10, 11]])]
np.hsplit(a, (3, 4)) # [:, :3], [:, 3:4], [:, 4:]๋ก ๋ถํ
# [array([[0, 1, 2],[6, 7, 8]]),array([[3],[9]]),array([[4, 5],[10, 11]])]
np.vsplit(a, 2) # axis=0 ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ 2๋ฑ๋ถ
์ ๋ณด์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.