[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