파이썬/파이썬 심화

[파이썬 심화] 3-1. NumPy 벡터화 연산 속도 비교, 브로드캐스팅

  • -
반응형

일반 연산과 벡터화 연산 계산 속도 비교

  • 일반 연산
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]]
'''
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 구독, 공감 부탁드립니다.