[Python] Numpy

Updated:

오늘은 행렬과 같은 다차원 배열을 쉽게 처리 할 수 있도록 지원해주는 파이썬의 라이브러리인 Numpy 에 대해서 알아보겠습니다.

Numpy 배열

numpy에서 배열은 동일한 타입의 값들을 가지며 배열의 차원을 rank, 배열의 구조는 튜플 형태의 shape(행,열) 으로 나타내어 집니다.

numpy-matrix-diag

numpy 배열은 numpy에서 제공하는 함수에 인자로 리스트 객체와 데이터 타입 $($dtype)을 입력하여 생성할수 있습니다. 단 데이터 타입이 생략될 경우 리스트 객체의 요소 타입으로 설정됩니다. ex) .array(list, dtype=float)

import numpy as np

# 1차원 배열로 numpy 배열 생성
list = [1,2,3,4,5,6]
a = np.array(list)
print(a.shape) # 출력 : (6,)

# 2차원 배열로 numpy 배열 생성
b = np.array([1,2,3], [4,5,6])
print(b.shape) # 출력 : (2,3) 
print(b[0,0]) # 출력 : 1

# 3차원 배열로 numpy 배열 생성
c = np.array([[[1,2,3], [4,5,6]], [[3,2,1], [4,5,6]]], dtype=float)
print(c.shape) # 출력 : (2,2,3)
print(c)
# 출력 : 
#[[[ 1.  2.  3.]
#  [ 4.  5.  6.]]

# [[ 3.  2.  1.]
#  [ 4.  5.  6.]]]

위의 예제에서 a의 경우 일차원 배열로 rank는 1이고 shape은 (6,)가 된다.

배열 생성 및 초기화

numpy는 numpy 배열을 생성하기 위한 함수로 zeros$($), ones$($), full$($), eye$($) 등을 제공합니다.

  • zeros$($) : 해당 배열 전체를 0으로 초기화.
    a = np.zeros((2,2))
    print(a)
    # 출력:
    # [[ 0.  0.]
    #  [ 0.  0.]]
    
  • ones$($) : 해당 배열 전체를 1로 초기화.
    a = np.ones((2,3))
    print(a)
    # 출력:
    # [[ 1.  1.  1.]
    #  [ 1.  1.  1.]]
    
  • full$($) : 해당 배열 전체를 사용자가 인자로 지정한 값으로 초기화.
    a = np.full((2,3), 5) # 5로 초기화
    print(a)
    # 출력:
    # [[5 5 5]
    #  [5 5 5]]
    
  • eye$($) : 대각선으로는 1이고 나머지는 0인 2차원 배열로 초기화.
    a = np.eye(3)
    print(a)
    # 출력:
    # [[ 1.  0.  0.]
    #  [ 0.  1.  0.]
    #  [ 0.  0.  1.]]
    

numpy 슬라이싱

각 차원별로 numpy 배열을 슬라이싱 하여 범위를 지정하여 부분집합을 구할 수 있습니다.

slicing -> [start : stop : step] $($ stop의 index는 포함하지 않습니다.)

import numpy as np
 
lst = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
arr = np.array(lst)
 
# 슬라이싱
a = arr[0:2, 0:2]
print(a)
# 출력:
# [[1 2]
#  [4 5]]

numpy iteger indexing

각 차원별로 선택되어지는 배열요소의 인덱스들을 일렬로 나열하여 부분집합을 구하는 방식입니다. 즉, 임의의 numpy 배열 a 에 대해 a[[row1, row2], [col1, col2]] 와 같이 표현하는 것인데, 이는 a[row1, col1] 과 a[row2, col2] 라는 두 개의 배열요소의 집합을 의미합니다.

import numpy as np
 
lst = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
]
a = np.array(lst)
 
# 정수 인덱싱
s = a[[0, 2], [1, 3]]
# a[0,1] , a[2,3]
 
print(s)
# 출력
# [2 12]

numpy boolean indexing

boolean indexing은 임의의 표현식을 사용하여 배열의 요소를 true, false로 구분하여 true에 해당하는 요소들만을 부분집합으로 만든것을 말합니다.

import numpy as np

# 1~9까지의 원소를 3x3 이차원 배열 형태로 생성
lst = np.arrange(1,10).reshape((3,3))

a = np.array(lst)
 
# 배열 a 에 대해 짝수면 True, 홀수면 False 
bool_indexing = (a % 2 == 0)
 
print(bool_indexing)
# 출력: 
# [[False  True False]
#  [ True False  True]
#  [False  True False]]
 
# 부울린 인덱스를 사용하여 True인 요소만 뽑아냄
print(a[bool_indexing])
# 출력:
# [2 4 6 8]
 
# 더 간단한 표현
n = a[ a % 2 == 0 ]
print(n)

numpy 연산

numpy를 사용하여 배열간의 연산을 할 수 있습니다.

import numpy as np

a = np.array([1,2,3])
b = np.array([4,5,6])

c = a+b 
print(c) #출력 : [5 7 9]

c = a-b
print(c) #출력 : [-3 -3 -3]

c = a*b
print(c) #출력 : [4 10 18]

c = a/b
print(c) #출력 : [0.25 0.4 0.5]
  • .dot$($) : vector와 matrix의 product을 계산하기 위해 사용된다. ex) np.dot(arr1, arr2)

  • .sum$($) : 첫번째 인자로 전달되는 배열 요소들을 더하며 두번째 인자에 axis = 0 이면 끼리, axis = 1 이면 끼리 더한다.

  • .prod$($) : 인자로 전달되는 배열의 요소들을 전부 곱한 값을 반환

import numpy as np
 
a = np.array([1,2], [3,4])
b = np.array([5,6], [7,8])
 
c = np.dot(a, b)
print(c)
# 출력:
# [[19 22]
#  [43 50]]    

s = np.sum(a)
print(s) # 10 = (1+2+3+4)

s = np.sum(a, axis=0) # 열 끼리 더함
print(s) # [4 6]

s = np.sum(a, axis=1) # 행 끼리 더함
print(s) # [3 7]

s = np.prod(a) # 각 배열 요소들을 전부 곱함
print(s) # 24 = (1*2*3*4)

참고자료

  • http://taewan.kim/post/numpy_cheat_sheet/
  • http://pythonstudy.xyz/python/article/402-numpy-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

Categories:

Updated:

Leave a comment