๐Ÿ•‘

4.8.1. Numpy

ํ•ด๋‹น ๊ฐ•์˜๋Š” 30๋ถ„ ๋ฌด๋ฃŒ ์š”์•ฝ๊ฐ•์ขŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์œ ํŠœ๋ธŒ, ์ธํ”„๋Ÿฐ, Edwith์—์„œ ๋ฌด๋ฃŒ๋กœ ์‹œ์ฒญ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
Video preview

๋ชฉ์ฐจ

Numpy๋ž€

  • C์–ธ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
  • ๋‹ค์ฐจ์› ๋ฐฐ์—ด(ndarray)์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ฃผ๋Š” ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
ย 
โ€ป ndarray vs list
  • ndarray : ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ชจ๋“  ์›์†Œ๋Š” ๊ฐ™์€ ์ž๋ฃŒํ˜•์„ ๊ฐ€์ง„๋‹ค.
  • list : ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ฆฌ๊ณ , ์›์†Œ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

ndarray

  • N-dimensional Array
  • ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์ง€์›ํ•œ๋‹ค.
  • ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์—†๋‹ค.
  • ๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ๋ฐฐ์—ด ๊ฐ„์— ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
ย 

๋ฐ์ดํ„ฐ ํƒ€์ž… ์ข…๋ฅ˜

  1. int(8bit, 16bit, 32bit, 64bit) i1, i2, i4, i8
  • ๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋‹ค.
  • ๋น„ํŠธ์ˆ˜ ๋งŒํผ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ •์ˆ˜ํ˜•์ด๋‹ค.
  • ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ๋ฒ”์œ„ : -2โฟโปยน ~ 2โฟโปยน-1
    • ย 
2. uint(8bit, 16bit, 32bit, 64bit) u1, u2, u4, u8
  • ๋ถ€ํ˜ธ๊ฐ€ ์—†๋‹ค.
  • ๋น„ํŠธ์ˆ˜ ๋งŒํผ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ •์ˆ˜ํ˜•์ด๋‹ค.
  • ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ๋ฒ”์œ„ : 0 ~ 2โฟ-1
ย 
3. float(16bit, 32bit, 64bit, 128bit) f2, f4, f8, f16
  • ๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋‹ค.
  • ๋น„ํŠธ์ˆ˜ ๋งŒํผ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ์‹ค์ˆ˜ํ˜•์ด๋‹ค.
ย 
4. ๋ณต์†Œ์ˆ˜ํ˜•
  • complex64 : ๋‘๊ฐœ์˜ 32๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ณต์†Œ์ˆ˜ c8
  • complex128 : ๋‘๊ฐœ์˜ 64๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ณต์†Œ์ˆ˜ c16
ย 
5. unicode
  • ๊ณ ์ • ๊ธธ์ด ๋ฌธ์ž์—ด unicode
ย 
6. bool
  • True, False
ย 
7. ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ™•์ธ ๋ฐ ๋ณ€๊ฒฝ
  • dtype : ์ž๋ฃŒํ˜• ํ™•์ธ
  • astype : ์ž๋ฃŒํ˜• ๋ณ€๊ฒฝ
ย 
์ž…๋ ฅ
import numpy as np
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] a = np.array(data) a
ย 
์ถœ๋ ฅ
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ย 
์ž…๋ ฅ
a.dtype
ย 
์ถœ๋ ฅ
dtype('int32')
ย 
์ž…๋ ฅ
a = a.astype(np.float32) a
ย 
์ถœ๋ ฅ
array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]], dtype=float32)
ย 
์ž…๋ ฅ
a[0][1]
ย 
์ถœ๋ ฅ
2.0
ย 
์ž…๋ ฅ
a[0]
ย 
์ถœ๋ ฅ
array([1., 2., 3.], dtype=float32)
ย 
  • np.arange(start, stop, step) : step์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.
  • reshape : ๋งŒ๋“ค์–ด์ง„ ๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ํ˜•ํƒœ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.
์ž…๋ ฅ
np.arange(1, 10, 2) # (start, stop, step)
ย 
์ถœ๋ ฅ
array([1, 3, 5, 7, 9])
ย 
์ž…๋ ฅ
np.arange(1, 10).reshape(3, 3)
ย 
์ถœ๋ ฅ
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ย 
์ž…๋ ฅ
np.arange(1, 13).reshape(3, 2, 2)
ย 
์ถœ๋ ฅ
array([[[ 1, 2], [ 3, 4]], [[ 5, 6], [ 7, 8]], [[ 9, 10], [11, 12]]])
ย 
  • nan
    • ์ž๋ฃŒํ˜•์ด Floatํ˜•์ด๋ฏ€๋กœ Integer์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ๋ฐฐ์—ด์—์„œ ์—ฐ์‚ฐํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ’์ด NaN์ด ๋œ๋‹ค.
์ž…๋ ฅ
np.nan * 10
ย 
์ถœ๋ ฅ
nan
ย 
์ž…๋ ฅ
a[0][1] = np.nan a
ย 
์ถœ๋ ฅ
array([[ 1., nan, 3.], [ 4., 5., 6.], [ 7., 8., 9.]], dtype=float32)
ย 
์ž…๋ ฅ
a = np.arange(1, 10).reshape(3, 3) a
ย 
์ถœ๋ ฅ
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ย 
์ž…๋ ฅ
a[0][1] = np.nan # integer์—์„œ๋Š” nan์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค.
ย 
์ถœ๋ ฅ
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-15-10bef5bd968c> in <module> ----> 1 a[0][1] = np.nan ValueError: cannot convert float NaN to integer
ย 
์ž…๋ ฅ
a = np.linspace(1, 10, 20) # (start, stop, num) a
ย 
์ถœ๋ ฅ
array([ 1. , 1.47368421, 1.94736842, 2.42105263, 2.89473684, 3.36842105, 3.84210526, 4.31578947, 4.78947368, 5.26315789, 5.73684211, 6.21052632, 6.68421053, 7.15789474, 7.63157895, 8.10526316, 8.57894737, 9.05263158, 9.52631579, 10. ])

์—ฐ์‚ฐ

  • ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„, ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ๋Š” ๋ฐ˜๋ณต์—ฐ์‚ฐ์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์„ ํ˜• ๋Œ€์ˆ˜ ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • np.dot, @ : ํ–‰๋ ฌ ๊ณฑ ๊ตฌํ•˜๋Š” ์—ฐ์‚ฐ
์ž…๋ ฅ
data = np.arange(1, 10).reshape(3, 3) data
ย 
์ถœ๋ ฅ
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ย 
์ž…๋ ฅ
data + data
ย 
์ถœ๋ ฅ
array([[ 2, 4, 6], [ 8, 10, 12], [14, 16, 18]])
ย 
์ž…๋ ฅ
[1, 2, 3] + [4, 5, 6] # ๋ฆฌ์ŠคํŠธ๋ผ๋ฆฌ ๋”ํ•˜๋ฉด ์—ฐ๊ฒฐ๋œ๋‹ค.
ย 
์ถœ๋ ฅ
[1, 2, 3, 4, 5, 6]
ย 
์ž…๋ ฅ
data - data
ย 
์ถœ๋ ฅ
array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])
ย 
์ž…๋ ฅ
data * data
ย 
์ถœ๋ ฅ
array([[ 1, 4, 9], [16, 25, 36], [49, 64, 81]])
ย 
์ž…๋ ฅ
data / data
ย 
์ถœ๋ ฅ
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
ย 
์ž…๋ ฅ
np.dot(data, data)
ย 
์ถœ๋ ฅ
array([[ 30, 36, 42], [ 66, 81, 96], [102, 126, 150]])
ย 
์ž…๋ ฅ
data@data
ย 
์ถœ๋ ฅ
array([[ 30, 36, 42], [ 66, 81, 96], [102, 126, 150]])
ย 

์ฐจ์›

  • 0์ฐจ์› : Scalar (ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์œผ๋กœ๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ)
  • 1์ฐจ์› : Vector (์ˆซ์ž๋“ค์˜ ๋ฐฐ์—ด (1D array))
  • 2์ฐจ์› : Matrix (์ˆซ์ž๋“ค์˜ 2D array (rows: ํ–‰, columns: ์—ด))
  • 3์ฐจ์› ์ด์ƒ : Tensor (์ˆซ์ž๋“ค์˜ ๋‹ค์ฐจ์› ๋ฐฐ์—ด)
์ž…๋ ฅ
# 0์ฐจ์› a = np.array(1) print(a) print(a.shape) print(a.ndim)
ย 
์ถœ๋ ฅ
1 () 0
ย 
์ž…๋ ฅ
# 1์ฐจ์› a = np.array([1]) print(a) print(a.shape) print(a.ndim)
ย 
์ถœ๋ ฅ
[1] (1,) 1
ย 
์ž…๋ ฅ
# 1์ฐจ์› a = np.array([1, 2, 3, 4, 5]) print(a) print(a.shape) print(a.ndim)
ย 
์ถœ๋ ฅ
[1 2 3 4 5] (5,) 1
ย 
์ž…๋ ฅ
# 2์ฐจ์› a = np.array([[1, 2, 3], [4, 5, 6]]) print(a) print(a.shape) print(a.ndim)
ย 
์ถœ๋ ฅ
[[1 2 3] [4 5 6]] (2, 3) 2
ย 
์ž…๋ ฅ
# 2์ฐจ์› a = np.array([[1]]) print(a) print(a.shape) print(a.ndim)
ย 
์ถœ๋ ฅ
[[1]] (1, 1) 2
ย 
์ž…๋ ฅ
# 3์ฐจ์› a = np.array([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]) print(a) print(a.shape) print(a.ndim)
ย 
์ถœ๋ ฅ
[[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8] [ 9 10] [11 12]]] (2, 3, 2) 3
ย 

matrix ์œ ํ˜•

  • zeros : 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ฐฐ์—ด ์ƒ์„ฑ
  • ones : 1๋กœ ์ดˆ๊ธฐํ™” ๋œ ๋ฐฐ์—ด ์ƒ์„ฑ
  • eye : ์ฃผ๋Œ€๊ฐ์„ ์˜ ์›์†Œ๊ฐ€ ๋ชจ๋‘ 1์ด๊ณ  ๋‚˜๋จธ์ง€ ์›์†Œ๋Š” 0์ธ ์ •์‚ฌ๊ฐํ–‰๋ ฌ (๋‹จ์œ„ํ–‰๋ ฌ)
  • empty : ์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด๋งŒ ์ƒ์„ฑ, ๊ธฐ์กด์— ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์œผ๋กœ ๋‚˜ํƒ€๋‚จ
  • full : ์ง€์ •ํ•œ ์ˆซ์ž๋กœ ์ดˆ๊ธฐํ™”
  • linespace(start, end(ํฌํ•จ), number, endpoint = ) : ์„ ํ˜• ๊ตฌ๊ฐ„์„ ์ง€์ •ํ•œ ๊ฐœ์ˆ˜๋งŒํผ ๋ถ„ํ• ํ•œ๋‹ค.
    • endpoint = True or False : ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ํฌํ•จ์‹œํ‚ฌ์ง€ ์‹œํ‚ค์ง€ ์•Š์„์ง€ ์„ ํƒ
์ž…๋ ฅ
a = np.arange(12).reshape(2,3,2) a
ย 
์ถœ๋ ฅ
array([[[ 0, 1], [ 2, 3], [ 4, 5]], [[ 6, 7], [ 8, 9], [10, 11]]])
ย 
์ž…๋ ฅ
b = np.ones(12) b
ย 
์ถœ๋ ฅ
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
ย 
์ž…๋ ฅ
b = np.ones(12).reshape(2, 3, 2) b
ย 
์ถœ๋ ฅ
array([[[1., 1.], [1., 1.], [1., 1.]], [[1., 1.], [1., 1.], [1., 1.]]])
ย 
์ž…๋ ฅ
c = np.zeros(12).reshape(2, 3, 2) c
ย 
์ถœ๋ ฅ
array([[[0., 0.], [0., 0.], [0., 0.]], [[0., 0.], [0., 0.], [0., 0.]]])
ย 
์ž…๋ ฅ
d = np.eye(3) d
ย 
์ถœ๋ ฅ
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
ย 
์ž…๋ ฅ
e = np.zeros([3, 4]) e
ย 
์ถœ๋ ฅ
array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
ย 
์ž…๋ ฅ
e = np.zeros([3, 4, 2]) e
ย 
์ถœ๋ ฅ
array([[[0., 0.], [0., 0.], [0., 0.], [0., 0.]], [[0., 0.], [0., 0.], [0., 0.], [0., 0.]], [[0., 0.], [0., 0.], [0., 0.], [0., 0.]]])
ย 
์ž…๋ ฅ
f = np.empty([2, 3]) f
ย 
์ถœ๋ ฅ
array([[2.12199579e-314, 6.36598737e-314, 1.06099790e-313], [1.48539705e-313, 1.90979621e-313, 2.33419537e-313]])
ย 
์ž…๋ ฅ
g = np.full((3, 4), 1000) g
ย 
์ถœ๋ ฅ
array([[1000, 1000, 1000, 1000], [1000, 1000, 1000, 1000], [1000, 1000, 1000, 1000]])
ย 
์ž…๋ ฅ
h = np.linspace(2, 10, 6) h
ย 
์ถœ๋ ฅ
array([ 2. , 3.6, 5.2, 6.8, 8.4, 10. ])
ย 

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

  • mean : ํ‰๊ท ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • median : ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๊ธฐ๋กœ ์ •๋ ฌํ•˜๊ณ  ๊ทธ ์ค‘ ๊ฐ€์šด๋ฐ ์ˆ˜ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜
    • โ€ป ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ์ง์ˆ˜์ผ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๊ฐ€์šด๋ฐ์˜ ๋‘ ์ˆ˜์˜ ํ‰๊ท ์„ ๊ตฌํ•œ๋‹ค.
  • var : ๋ถ„์‚ฐ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • std : ํ‘œ์ค€ํŽธ์ฐจ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • sum : ํ•ฉ๊ณ„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • max : ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
  • min : ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
์ž…๋ ฅ
a = np.arange(10).reshape(2,5) a
ย 
์ถœ๋ ฅ
array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
ย 
์ž…๋ ฅ
a[0][0] = 100 a
ย 
์ถœ๋ ฅ
array([[100, 1, 2, 3, 4], [ 5, 6, 7, 8, 9]])
ย 
์ž…๋ ฅ
a[0, 1] = 1000 a
ย 
์ถœ๋ ฅ
array([[ 100, 1000, 2, 3, 4], [ 5, 6, 7, 8, 9]])
ย 
์ž…๋ ฅ
np.mean(a)
ย 
์ถœ๋ ฅ
114.4
ย 
์ž…๋ ฅ
np.median(a)
ย 
์ถœ๋ ฅ
6.5
ย 
์ž…๋ ฅ
np.std(a)
ย 
์ถœ๋ ฅ
296.5485457728633
ย 
์ž…๋ ฅ
np.var(a)
ย 
์ถœ๋ ฅ
87941.04
ย 
์ž…๋ ฅ
np.sum(a)
ย 
์ถœ๋ ฅ
1144
ย 
์ž…๋ ฅ
sum(a)
ย 
์ถœ๋ ฅ
array([ 105, 1006, 9, 11, 13])
ย 
์ž…๋ ฅ
a
ย 
์ถœ๋ ฅ
array([[ 100, 1000, 2, 3, 4], [ 5, 6, 7, 8, 9]])
ย 
์ž…๋ ฅ
np.sum(a, axis=0)
ย 
์ถœ๋ ฅ
array([ 105, 1006, 9, 11, 13])
ย 
์ž…๋ ฅ
np.sum(a, axis=1)
ย 
์ถœ๋ ฅ
array([1109, 35])
ย 
์ž…๋ ฅ
np.max(a)
ย 
์ถœ๋ ฅ
1000
ย 
์ž…๋ ฅ
np.min(a)
ย 
์ถœ๋ ฅ
2