파이썬/파이썬 심화
[파이썬 심화] 3-1. NumPy 벡터화 연산 속도 비교, 브로드캐스팅
Harvie
2023. 6. 18. 08:00
반응형
일반 연산과 벡터화 연산 계산 속도 비교
- 일반 연산
import numpy as np
import time
x = np.arange(1,10001)
y = np.arange(10001,20001)
# 일반 연산
start = time.time() # 시작 시간 측정
z = np.zeros_like(x)
for i in range(10000):
z[i] = x[i] + y[i]
end = time.time() # 종료 시간 측정
print(z[:10]) # [10002 10004 10006 10008 10010 10012 10014 10016 10018 10020]
print('%.8f sec' %(end-start)) # 0.00582504 sec
- 벡터화 연산
# 백터화 연산
start = time.time() # 시작 시간 측정
z = x+y
end = time.time() # 종료 시간 측정
print(z[:10]) # [10002 10004 10006 10008 10010 10012 10014 10016 10018 10020]
print('%.8f sec' %(end-start)) # 0.00028110 sec
일반 연산 : 0.00582504 sec
벡터화 연산 : 0.00028110 sec
(연산 시간은 컴퓨터 환경마다 다를 수 있습니다.)
일반 연산과 벡터화 연산은 차이가 많이 나는 걸 알 수 있습니다.
벡터화 연산
- 논리 연산 가능
a = np.array([1,2,3,4])
b = np.array([4,2,2,4])
print(a==b) # [False True False True]
print(a>b) # [False False True False]
- 배열 전체 비교 - all
a = np.array([1,2,3,4])
b = np.array([4,2,2,4])
c = np.array([1,2,3,4])
print(np.all(a==b)) # False
print(np.all(a==c)) # True
print(np.all(a!=b)) # False
- 지수함수, 로그함수 등도 벡 터화 연산을 지원
a = np.arange(5)
print(np.exp(a)) # [ 1. 2.71828183 7.3890561 20.08553692 54.59815003]
print(2**a) # [ 1 2 4 8 16]
print(np.log(a+1)) # [0. 0.69314718 1.09861229 1.38629436 1.60943791]
브로드캐스팅
- 모양이 다른 배열들 간의 연산
○ 차원의 크기가 1 이거나, 차원에 대해 축의 길이가 동일할 때 브로드캐스팅이 가능
○ 예) 벡터와 스칼라(일반적인 상수) 값을 더하는 경우
○ 예) 벡터와 스칼라(일반적인 상수) 값을 더하는 경우
○ 스칼라를 벡터와 같은 크기로 확장시켜서 계산
x = np.arange(5)
y = np.ones_like(x)
print(x) # [0 1 2 3 4]
print(y) # [1 1 1 1 1]
print(x+y) # [1 2 3 4 5]
print(x+1) # [1 2 3 4 5]
○ 모양이 다른 배열들 간의 연산 - 더 높은 차원에서
x = np.array([[0,1,2],[0,1,2],[0,1,2],[0,1,2],[0,1,2]])
y = np.array([0,1,2,3,4])
yt = y.reshape(5,1)
print(x+yt)
'''
[[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
'''
z = np.array([0,1,2])
print(x+z)
'''
[[0 2 4]
[0 2 4]
[0 2 4]
[0 2 4]
[0 2 4]]
'''
반응형