πŸ•‘

Numpy

notion imagenotion image

λͺ©μ°¨

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
Out[-] array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a.dtype
Out[-] dtype('int32')
a = a.astype(np.float32) a
Out[-] array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]], dtype=float32)
a[0][1]
Out[-] 2.0
a[0]
Out[-] array([1., 2., 3.], dtype=float32)
Β 
  • np.arange(start, stop, step) : step에 따라 μ¦κ°€ν•˜λŠ” μˆ˜μ—΄μ„ μƒμ„±ν•œλ‹€.
  • reshape : λ§Œλ“€μ–΄μ§„ λ°°μ—΄μ˜ 데이터λ₯Ό κ·ΈλŒ€λ‘œ 가지고 ν˜•νƒœλ₯Ό λ°”κΏ”μ€€λ‹€.
np.arange(1, 10, 2) # (start, stop, step)
Out[-] array([1, 3, 5, 7, 9])
np.arange(1, 10).reshape(3, 3)
Out[-] array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.arange(1, 13).reshape(3, 2, 2)
Out[-] array([[[ 1, 2], [ 3, 4]], [[ 5, 6], [ 7, 8]], [[ 9, 10], [11, 12]]])
Β 
  • nan
    • μžλ£Œν˜•μ΄ Floatν˜•μ΄λ―€λ‘œ Integerμ—μ„œλŠ” 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
    • λ°°μ—΄μ—μ„œ μ—°μ‚°ν•  경우 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šμ§€λ§Œ 결과값이 NaN이 λœλ‹€.
np.nan * 10
Out[-] nan
a[0][1] = np.nan a
Out[-] array([[ 1., nan, 3.], [ 4., 5., 6.], [ 7., 8., 9.]], dtype=float32)
a = np.arange(1, 10).reshape(3, 3) a
Out[-] array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a[0][1] = np.nan # integerμ—μ„œλŠ” nan을 μ‚¬μš© ν•  수 μ—†λ‹€.
Out[-] --------------------------------------------------------------------------- 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
Out[-] 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
Out[-] array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
data + data
Out[-] array([[ 2, 4, 6], [ 8, 10, 12], [14, 16, 18]])
[1, 2, 3] + [4, 5, 6] # 리슀트끼리 λ”ν•˜λ©΄ μ—°κ²°λœλ‹€.
Out[-] [1, 2, 3, 4, 5, 6]
data - data
Out[-] array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])
data * data
Out[-] array([[ 1, 4, 9], [16, 25, 36], [49, 64, 81]])
data / data
Out[-] array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
np.dot(data, data)
Out[-] array([[ 30, 36, 42], [ 66, 81, 96], [102, 126, 150]])
data@data
Out[-] 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)
Out[-] 1 () 0
# 1차원 a = np.array([1]) print(a) print(a.shape) print(a.ndim)
Out[-] [1] (1,) 1
# 1차원 a = np.array([1, 2, 3, 4, 5]) print(a) print(a.shape) print(a.ndim)
Out[-] [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)
Out[-] [[1 2 3] [4 5 6]] (2, 3) 2
# 2차원 a = np.array([[1]]) print(a) print(a.shape) print(a.ndim)
Out[-] [[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)
Out[-] [[[ 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
Out[-] array([[[ 0, 1], [ 2, 3], [ 4, 5]], [[ 6, 7], [ 8, 9], [10, 11]]])
b = np.ones(12) b
Out[-] array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
b = np.ones(12).reshape(2, 3, 2) b
Out[-] array([[[1., 1.], [1., 1.], [1., 1.]], [[1., 1.], [1., 1.], [1., 1.]]])
c = np.zeros(12).reshape(2, 3, 2) c
Out[-] array([[[0., 0.], [0., 0.], [0., 0.]], [[0., 0.], [0., 0.], [0., 0.]]])
d = np.eye(3) d
Out[-] array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
e = np.zeros([3, 4]) e
Out[-] array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
e = np.zeros([3, 4, 2]) e
Out[-] 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
Out[-] 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
Out[-] array([[1000, 1000, 1000, 1000], [1000, 1000, 1000, 1000], [1000, 1000, 1000, 1000]])
h = np.linspace(2, 10, 6) h
Out[-] 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
Out[-] array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
a[0][0] = 100 a
Out[-] array([[100, 1, 2, 3, 4], [ 5, 6, 7, 8, 9]])
a[0, 1] = 1000 a
Out[-] array([[ 100, 1000, 2, 3, 4], [ 5, 6, 7, 8, 9]])
np.mean(a)
Out[-] 114.4
np.median(a)
Out[-] 6.5
np.std(a)
Out[-] 296.5485457728633
np.var(a)
Out[-] 87941.04
np.sum(a)
Out[-] 1144
sum(a)
Out[-] array([ 105, 1006, 9, 11, 13])
a
Out[-] array([[ 100, 1000, 2, 3, 4], [ 5, 6, 7, 8, 9]])
np.sum(a, axis=0)
Out[-] array([ 105, 1006, 9, 11, 13])
np.sum(a, axis=1)
Out[-] array([1109, 35])
np.max(a)
Out[-] 1000
np.min(a)
Out[-] 2