본문 바로가기
투자를 위한 코딩/Python

Numpy 개요

by swcha02 2020. 9. 7.

Numpy란?

 

Numpy는 Numeric Python(혹은 Numerical Python)의 줄임말로서, 파이썬 프로그래밍에 쓰이는 패키지들 중에 하나이다. 원래는 Numeric이라는 이름으로 존재하고 있었는데, 개발자인 Jim Hugunin이 Numarray를 만들고, 이후에 Travis Oliphant가 Numarray의 기능들을 Numeric과 합쳐서 Numpy 패키지로 창조했다.

 

알아야하는 이유

 

사실 본인이 무슨 개발을 하느냐에 따라 중요도가 천차만별이긴하다. 공부와 경험이 부족해서 그런지, 프론트엔드/백엔드에선 딱히 쓰일 것 같지는 않다. 패키지명에서도 알 수 있듯이, Numpy는 대수적 연산에 관한 패키지들이며 프론트엔드와 백엔드에서 그런 기능들을 중요시 여길 것 같지는 않다.(물론 컴공생에게는 선형대수가 중요하다) 하지만 인공지능쪽으로 온다면 이야기는 완전히 달라진다. 인공지능은 태생적으로 수학과 연관이 매우 깊은 학문이다. 예를 들면,경제학에서 배우는 단순선형회귀분석(Simple Linear Regression Analysis)도 넓은 의미로 보자면 어느정도 전통적 ML 영역의 기초라고 볼 수 있는데, 이 모형은 선형대수학과 수리통계학으로 이루어진 모델이라고 봐도 무방하다. 물론 좁은 의미로 봐도 인공지능의 수학 중요성은 달라지지않는다. 머신러닝 서적에서 빠지지않는 기초주제인 SVD도 사실상 선형대수학의 분야에 속하며 더 나아가서 유명한 머신러닝 알고리즘들,서포트 벡터 머신(Support Vector Machine), 나이브 베이즈(Naive Bayes), 주성분 분석(PCA)등 여러가지 알고리즘들이 수학적 논리들을 컴퓨터로 구현한 것에 불과하다. 딥러닝의 여러가지 신경망도 본인이 보기에는 수학적인 응용에 지나지않는다. 그래서 ML/DL 쪽에서의 Numpy 패키지는 필수불가결이라고도 할 수 있을 것 같다. 수학 수식들을 컴퓨터로 표현해야하니까.

대수연산은 python 함수를 자체적으로 따로 만들거나 다른 모듈 혹은 패키지로 할 수 없나요?

 

할 수 있다. 개인적인 생각에는 다루는 데이터 양이 적다면 Numpy 연산의 중요도는 그렇게 높지는 않을 것이라 생각한다. 하지만 데이터가 편향되지 않았다는 가정하에서 모델을 학습할 떄 데이터 양은 왠만해서는 다다익선이기 떄문에, Numpy가 빛을 발한다고 생각한다.

 

예를 들면 모델이 만약에 학습하는 데이터 양이 적을 경우, 해당 데이터 안에 있는 우리가 목표로하는 패턴말고도 필요없는 노이즈까지 함께 학습해버릴 위험이 있다. 이러한 과적합 현상은 데이터 양을 늘려서 어느정도 방지가 가능하다. 그냥 간단히 말하면 경험 많은 사람과 경험 적은 사람의 차이라고 말할 수 있겠다.이건 ML이든 DL이든 결과는 비슷하다.(데이터 양의 중요도는 DL이 더 높다) .그렇다면 모델을 학습시키기 위해서는 데이터 양이 많은 게 좋다는 뜻인데,이 경우 Numpy 패키지가 수행하는 역할은 크다. Numpy 패키지의 연산속도가 일반적인 python의 다른 모듈 혹은 def로 만든 함수보다 엄청 빠르기 때문이다. 이건 데이터 양이 적든 많든 항상 그렇다. 그런데 데이터 양이 적을 경우 조금만 더 기다리기만 하면 Numpy 연산과 같은 결과가 나오지만, 데이터 양이 많으면 기다리는 시간이 매우 길어질 것이다.

 

import numpy as np
import time 

# data는 Numpy 테스트용, data_1은 내장 함수 테스트용
data = np.random.randint(1,1000, size = (100,1000)) 
data_1 = data.reshape(-1,) 
data_1 = list(data_1)
data_1


# 내장 함수로 계산 
start = time.time()
sum(data_1)
end = time.time()
print("파이썬 내장 함수로 걸린 시간:{}".format(end-start))

# Numpy로 계산
start = time.time()
np.sum(data)
end = time.time()
print("Numpy로 걸린 시간:{}".format(end-start))

각 결과물을 확인해보면 Numpy로 계산한 것이 더 빠르다는 것을 알 수 있다. 본인이 시험삼아서 해봤더니

 

-내장 함수로 걸린 시간:0.014957189559936523

 

-Numpy로 걸린 시간:0.00099945068359375

 

이렇게 나왔다. 

 

언뜻 보면 "정말 작은 차이 아니야?"라고 생각할 수 있는데, 절대로 아니다. 일단 함수 자체도 정말 간단한 것(sum : 모든 원소를 다 더함)을 썼다. 만약에 저기서 데이터 양이 더 많아지고 함수도 복잡해진다면 걸리는 시간은 더 차이가 날 것이다. 현재 ML/DL에서 공부하는 모델들을 본다면 아마도 내장함수만으로는 계산이 더디어 질 것이다. 참고로 Numpy 패키지 자체가 C/C++ 기반으로 만들어져서 당연히 파이썬보다 빠를 수 밖에 없다.  

 

이것말고도 Numpy 패키지안에는 좋은 모듈과 함수들이 내장되어 있어서 따로 def를 써서 함수를 안 만들어도 된다. 개인적으로는 이것만으로도 엄청나게 큰 이점이라고 생각한다. 이후에 공부할 때 마다 차근차근 올리겠다.

결론적으로, Numpy 패키지는 인공지능 개발이나 공부를 할때 필수불가결한 요소이므로 그냥 쓰는 게 낫다. 본인이 안쓴다 하더라도 다른 사람 코드에는 Numpy 코드가 들어가 있을 테니 저런 장점들을 다 무시하고 안 쓰고 싶더라도 인공지능 쪽을 공부하고 싶다면 Numpy를 써야할 것으로 생각한다.

댓글