본문으로 바로가기

파이썬 OpenCV 를 위한 Numpy 정리

category OpenCV 2020. 7. 24. 16:45
728x90

cheatsheet

 

배열 생성

np.array() 는 시퀀스 자료형을 받아 numpy 배열을 생성합니다.

>>> a = [1,2,3,4,5] 
>>> np.array(a)
array([1, 2, 3, 4, 5])
>>>
>>> a = [[1,2,3],[10,11,12]]
>>> np.array(a)
array([[ 1,  2,  3],
       [10, 11, 12]])
       
>>> r = range(10)
>>> type(r)
<class 'range'>
>>> a = np.array(r) 
>>> a.shape
(10,)
>>> a.size
10

 

arange() range() 와 유사하며 해당 범위의 요소들을 가지는 배열을 생성합니다.

>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>> np.arange(1,10,2)
array([1, 3, 5, 7, 9])
>>>
>>> range(10)
range(0, 10)
>>> range(1, 10, 2)
range(1, 10, 2)

 

zeros() 는 0으로 채운 배열을 생성합니다.

>>> np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

>>> np.zeros((100,100)) 
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.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]])

 

ones() 는 1로 채운 배열을 생성합니다.

>>> np.ones(5)       
array([1., 1., 1., 1., 1.])

>>> np.ones((5,5))   
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

>>> np.ones((3,3), dtype=np.float32) 
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]], dtype=float32)

 

empty() 는 메모리에 있는 값으로 배열을 생성합니다.

배열의 크기가 크면 초기화하는데 시간이 걸리므로, 단축할때 사용합니다.

>>> np.empty((6,6))
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.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])

 

zeros_like() ones_like() empty_like() 는 기존의 배열과 동일한 shape의 배열을 생성합니다.

>>> a = [[1,2,3], [10,11,12]]

>>> a = np.array(a)

>>> a
array([[ 1,  2,  3],
       [10, 11, 12]])

>>> np.zeros_like(a)
array([[0, 0, 0],
       [0, 0, 0]])
       
>>> np.ones_like(a)
array([[1, 1, 1],
       [1, 1, 1]])

>>> np.empty_like(a)
array([[0, 0, 0],
       [0, 0, 0]])

 

full() 은 배열에 지정한 값으로 초기화한 배열을 생성합니다.

>>> np.full((10,10), 255)
array([[255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
       [255, 255, 255, 255, 255, 255, 255, 255, 255, 255]])
       
>>> np.full((400, 200, 3), (255, 255, 255), dtype=np.uint8) 
array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       ...,

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], dtype=uint8)

 

eye() 는 대각선으로 1인 배열을 생성합니다.

>>> np.eye((5))   
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

 

 

 

shape, size (attribute)

>>> import numpy as np
>>> a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
>>> a
array([[ 1,  2,  4,  7],
       [ 9, 88,  6, 45],
       [ 9, 76,  3,  4]])
>>> a.shape
(3, 4)
>>> a.size
12

 

T (attribute)

행과 열을 바꾼 배열을 얻을 수 있습니다.

>>> a = np.arange(12)
>>> ra = a.reshape(3,4) 
>>> 
>>> ra 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> ra.T
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])

 

사칙연산

>>> import numpy as np
>>> a = np.array([[5,6,7], [11,12,13], [14,15,16]])
>>> b = np.array([[25,26,27], [15,17,18], [4,5,6]])
>>>
>>> a+b
array([[30, 32, 34],
       [26, 29, 31],
       [18, 20, 22]])
>>> b-a
array([[ 20,  20,  20],
       [  4,   5,   5],
       [-10, -10, -10]])
>>> a*b
array([[125, 156, 189],
       [165, 204, 234],
       [ 56,  75,  96]])
>>> b/a
array([[5.        , 4.33333333, 3.85714286],
       [1.36363636, 1.41666667, 1.38461538],
       [0.28571429, 0.33333333, 0.375     ]])

 

브로드캐스팅

브로드캐스팅은 shape가 다른 배열간 연산을 자동으로 지원하는 기능입니다.

>>> a = np.arange(9) 
>>> ra = np.reshape(3,3) 
>>> ra = a.reshape(3,3)  
>>> ra
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])


>>> ra + 3
array([[ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
>>>
>>> ra - 3
array([[-3, -2, -1],
       [ 0,  1,  2],
       [ 3,  4,  5]])
>>> ra * 2
array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
>>>
>>> ra / 1.5
array([[0.        , 0.66666667, 1.33333333],
       [2.        , 2.66666667, 3.33333333],
       [4.        , 4.66666667, 5.33333333]])

 

np.sum()

원소들의 합 (axis=0 같은 열 , axis=1 같은 행)

>>> a = np.array([[1,4,7,8],[3,5,5,6]])
>>> np.sum(a)
39
>>> np.sum(a, axis=0) 
array([ 4,  9, 12, 14])
>>> np.sum(a, axis=1) 
array([20, 19])

 

np.diff()

배열 근접 원소간의 차 (axis=0 같은 열 , axis=1 같은 행)

>>> a = np.array([[1,4,7,8],[3,5,5,6]])  
>>> np.diff(a)
array([[3, 3, 1],
       [2, 0, 1]])
>>> np.diff(a, axis=0) 
array([[ 2,  1, -2, -2]])
>>> np.diff(a, axis=1) 
array([[3, 3, 1],
       [2, 0, 1]])
>>> a = np.array([[1,4,7,8],[3,5,5,6],[1,1,1,1]])
>>> a                  
array([[1, 4, 7, 8],
       [3, 5, 5, 6],
       [1, 1, 1, 1]])
>>> np.diff(a, axis=0) 
array([[ 2,  1, -2, -2],
       [-2, -4, -4, -5]])
>>> np.diff(a, axis=1) 
array([[3, 3, 1],
       [2, 0, 1],
       [0, 0, 0]])

 

np.argmax() np.argmin()

argmax() 은 배열에서 최대값의 인덱스를 구합니다. (axis=0 같은 열 , axis=1 같은 행)

flatten() 은 다차원 배열을 1차원으로 구합니다.

>>> a
array([[ 1,  2,  4,  7],
       [ 9, 88,  6, 45],
       [ 9, 76,  3,  4]])
       
>>> np.argmax(a)
5
>>> a.flatten()
array([ 1,  2,  4,  7,  9, 88,  6, 45,  9, 76,  3,  4])

>>> np.argmax(a, axis=0)
array([1, 1, 1, 1], dtype=int64)

>>> np.argmax(a, axis=1)
array([3, 1, 1], dtype=int64)

 

argmin() 은 배열에서 최소값의 인덱스를 구합니다. (axis=0 같은 열, axis=1 같은 행)

>>> a
array([[ 1,  2,  4,  7],
       [ 9, 88,  6, 45],
       [ 9, 76,  3,  4]])
       
>>> np.argmin(a)
0
>>> a.flatten()
array([ 1,  2,  4,  7,  9, 88,  6, 45,  9, 76,  3,  4])

>>> np.argmin(a, axis=0) 
array([0, 0, 2, 2], dtype=int64)

>>> np.argmin(a, axis=1) 
array([0, 2, 2], dtype=int64)

 

np.reshape()

배열의 shape 를 변경합니다.

>>> import numpy as np
>>> a = np.arange(80)
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
       51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
       68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79])
>>> a.reshape(8, 10)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]])
>>> a.reshape(5, 16)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
       [32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47],
       [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63],
       [64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79]])