[Python] Numpy
Updated:
오늘은 행렬과 같은 다차원 배열을 쉽게 처리 할 수 있도록 지원해주는 파이썬의 라이브러리인 Numpy 에 대해서 알아보겠습니다.
Numpy 배열
numpy에서 배열은 동일한 타입의 값들을 가지며 배열의 차원을 rank, 배열의 구조는 튜플 형태의 shape(행,열) 으로 나타내어 집니다.

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
Leave a comment