๐Ÿง‘โ€๐Ÿ’ป [Python EDA 1] Numpy

๊น€๋ฏธ์—ฐยท2023๋…„ 8์›” 19์ผ
0

[๋‚˜๋งŒ์˜ ๋…ธํŠธ] Python EDA

๋ชฉ๋ก ๋ณด๊ธฐ
1/8

1. Numpy๋ž€

https://numpy.org/

  • Numerical Python

  • ์ˆ˜์น˜์—ฐ์‚ฐ ๋ฐ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์— ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์ตœ์ ํ™”๋œ C code๋กœ ๊ตฌํ˜„ โ†’ ์ข‹์€ ์„ฑ๋Šฅ

  • ํŒŒ์ด์ฌ๊ณผ ๋‹ฌ๋ฆฌ, ์ˆ˜์น˜ ์—ฐ์‚ฐ์˜ ์•ˆ์ •์„ฑ ๋ณด์žฅ(numerical stable)
    โ€‹

2. Numpy๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

  • ๋ฐ์ดํ„ฐ๋Š” ๋ฒกํ„ฐ๋กœ ํ‘œํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ์ž˜ ํ•ด์•ผ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ž˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ค์ˆ˜๊ฐ’ ์—ฐ์‚ฐ์— ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋ฉด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŒŒ์ด์ฌ์€ ์ˆ˜์น˜ ์—ฐ์‚ฐ์— ์ทจ์•ฝํ•œ ๋ฐ˜๋ฉด, Numpy๋Š” ์ˆ˜์น˜ ์—ฐ์‚ฐ์ด ์•ˆ์ •์ ์ด๋‹ค.
  • Numpy๋Š” ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.
    โ€‹

3. Numpy array

  • Numpy์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ

  • python ๋ฆฌ์ŠคํŠธ์™€ ๋น„์Šทํ•˜๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

    1. ์„ ์–ธํ•œ ์ดํ›„ ํฌ๊ธฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
    2. ๋ชจ๋“  ์›์†Œ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋™์ผ
    3. numpy array๋ผ๋ฆฌ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ(python ๋ฆฌ์ŠคํŠธ๋Š” ๋ง์…ˆ๋งŒ ๊ฐ€๋Šฅ)
    4. numpy array ์ „์ฒด์— ์—ฐ์‚ฐ ๊ฐ€๋Šฅ(python ๋ฆฌ์ŠคํŠธ๋Š” ๊ณฑ์…ˆ๋งŒ ๊ฐ€๋Šฅ)
  • ๊ฐ ์ฐจ์›์„ ์ถ•(axis)์ด๋ผ๊ณ  ํ‘œํ˜„

    ์ถœ์ฒ˜: https://www.pythontutorial.net/python-numpy/what-is-numpy/

โ€‹

4. Numpy ์‚ฌ์šฉ๋ฐฉ๋ฒ•

1) ์„ค์น˜

!pip install numpy==1.23.5

2) ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

import numpy as np

3) ๋ฒ„์ „ ํ™•์ธ

np.__version__

5. Numpay array ์ƒ์„ฑ

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๋“ฑ๋ถ„(๊ฒฐ๊ณผ๋Š” ์œ„์™€ ๋™์ผ)

6. Numpay array ์—ฐ์‚ฐ

  • ๋ง์…ˆ, ๋บ„์…ˆ, ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ : ์ฐจ์›(์ถ•)์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ™์€ ์œ„์น˜์— ์žˆ๋Š” ์›์†Œ๋ผ๋ฆฌ ์—ฐ์‚ฐ
  • ๋ฒกํ„ฐ์˜ ๋‚ด์ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ
    v1 @ v2
  • ๋…ผ๋ฆฌ ์—ฐ์‚ฐ
    arr1 < 35
    โ€‹
    filter = np.where(arr1 > 4) # ๊ด„ํ˜ธ ์•ˆ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ True์ธ ์š”์†Œ์˜ ์ธ๋ฑ์Šค ๋‹ด๊ธด array
    • ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’ ์ถ”์ถœ ๊ฐ€๋Šฅ
      โ€‹
  • ์ž๋™ ํ˜• ๋ณ€ํ™˜
    : ์ˆ˜์น˜์—ฐ์‚ฐํ•  ๋•Œ ๊ฐ๊ฐ์˜ dtype์ด ๋‹ค๋ฅด๋ฉด, ๋” ํฐ ๋ฒ”์œ„์˜ ํƒ€์ž…(int < float < complex)์œผ๋กœ ๋ฐ์ดํ„ฐํƒ€์ž… ๋ณ€๊ฒฝ
    โ€‹
  • Broadcast
    : ์„œ๋กœ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ numpy array๋ฅผ ์—ฐ์‚ฐํ•  ๋•Œ, ์ž๋™์œผ๋กœ ์—ฐ์‚ฐ์„ ์ „ํŒŒ(broadcast)ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ
    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]]
  • Universal Function
    : broadcast ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•ด, numpy array์˜ ๋ชจ๋“  ์›์†Œ์— ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ ์šฉํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด๋Š” ๊ธฐ๋Šฅ
    ๐ŸŒŸ ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅธ ์„ฑ๋Šฅ
    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ํ–‰ ์ „๋ถ€ ์ถœ๋ ฅ

โ€‹

7. Numpy ํ•จ์ˆ˜

1) ์ˆ˜ํ•™ ํ•จ์ˆ˜

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) # ๋‚˜๋ˆ„๊ธฐ

2) ์ง‘๊ณ„ ํ•จ์ˆ˜

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)
    ์—ด ๊ธฐ์ค€์œผ๋กœ ๋”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ€๋กœ๋ฐฉํ–ฅ์œผ๋กœ ๋”ํ•œ๋‹ค

3) ์ •๋ ฌ ํ•จ์ˆ˜

np.sort(mat2, axis=0) # ์ •๋ ฌ (์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋งŒ ๊ฐ€๋Šฅ)
np.argsort(mat2, axis=0) # ์ •๋ ฌ ํ›„ ์›๋ณธ ๋ฐ์ดํ„ฐ index ์ถœ๋ ฅ

โ€‹

8. Numpy ์†์„ฑ

arr = np.array([[1, 2],[3, 4]])
arr.shape # numpy array ๊ฐ ์ถ•์˜ ํฌ๊ธฐ
arr.ndim # ์ถ•์˜ ๊ฐœ์ˆ˜
arr.dtype # ๊ฐ ์š”์†Œ์˜ ํƒ€์ž…
arr.itemsize # ๊ฐ ์š”์†Œ ํƒ€์ž…์˜ bytes ํฌ๊ธฐ
arr.size # ์ „์ฒด ์š”์†Œ์˜ ๊ฐœ์ˆ˜

โ€‹

9. Numpy ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ

1) ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ

a = np.arange(10)**2
a[2] # a ๋ฐฐ์—ด์˜ 2๋ฒˆ์งธ ์ธ๋ฑ์Šค ์ถœ๋ ฅ
a[::-1] # reverse : ๋ฐฐ์—ด์˜ ์š”์†Œ ๊ฑฐ๊พธ๋กœ ์ถœ๋ ฅ
a[0:6:2] = 1000 # ์ธ๋ฑ์Šค 0, 2, 4 ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์— 1000 ์‚ฝ์ž…

2) ์ธ๋ฑ์Šค ๋ฐฐ์—ด๋กœ ์ธ๋ฑ์‹ฑ

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]] ์ถœ๋ ฅ

3) boolean ์ธ๋ฑ์‹ฑ

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,) ์ถœ๋ ฅ

โ€‹

10. Numpy ํฌ๊ธฐ ๋ณ€๊ฒฝ

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)์œผ๋กœ ๋ณ€๊ฒฝ

โ€‹

11. Numpy ๋ฐ์ดํ„ฐ ํ•ฉ์น˜๊ธฐ

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/

โ€‹

12. Numpy ๋ฐ์ดํ„ฐ ์ชผ๊ฐœ๊ธฐ

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๋“ฑ๋ถ„

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

comment-user-thumbnail
2023๋…„ 8์›” 19์ผ

์ •๋ณด์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ