최근 수정 시각 : 2024-02-05 18:14:30

NumPy


NumPy
넘파이(넘피)
파일:NumPy의 로고.svg
버전 1.24.2
2023년 2월 5일 업데이트
웹사이트 공식 홈페이지
pypi

1. 개요2. 다른 Python 패키지와의 관계3. 라이브러리에 포함된 함수

[clearfix]

1. 개요

Numarray와 Numeric이라는 오래된 Python 패키지를 계승해서 나온 수학 및 과학 연산을 위한 파이썬 패키지이다. Py는 파이썬을 나타내기 때문에, 일반적으로 넘파이라고 읽는다.

프로그래밍 하기 어려운 C, C++, Fortran[1] 등의 언어에 비하면, NumPy로는 꽤나 편리하게 수치해석을 실행할 수 있다. 게다가 Numpy 내부는 상당부분 C나 포트란으로 작성되어 실행 속도도 꽤 빠른편이다. 기본적으로 ndarray라는 자료를 생성하고 이를 바탕으로 색인, 처리, 연산 등을 하는 기능을 수행한다. 물론 넘파이 자체만으로도 난수생성, 푸리에변환, 행렬연산, 간단한 기술통계 분석 정도는 가능하지만 실제로는 Scipy, Pandas, matplotlib 등 다른 Python 패키지와 함께 쓰이는 경우가 많다.

파이썬으로 수치해석, 통계 관련 기능을 구현한다고 할 때 Numpy는 가장 기본이 되는 모듈이다. 그만큼 Numpy는 수치해석, 통계 관련 작업시 중요한 역할을 하므로, 파이썬으로 관련 분야에 도전하고자 한다면 반드시 이에 대한 기초를 잘 쌓아두고 가자.

하도 기본적으로 쓰이는 모듈이다 보니 아래와 같이 numpy를 np로 호출하는 것이 관례가 되었다.
#!syntax python
import numpy as np

2. 다른 Python 패키지와의 관계

  • Scipy (싸이파이 = 싸이언스 + 파이썬)
Numpy와 Scipy는 서로 떨어질 수 없을 정도로 밀접한 관계에 있으며 Scipy를 활용할 때에는 상당히 많이 Numpy를 이용하게 된다. 실제로 Scipy에 관한 책을 구매했을 때 책의 앞부분은 Scipy 관련 내용보다는 오히려 Numpy의 기초에 대한 내용 위주로 보게 되는 경우가 많다.

Scipy는 수치해석시 Numpy를 보다 본격적으로 이용할 수 있게 해 준다. 사실 대학 학부 수준의 수치해석 교재에 있는 여러 수치 미분법이나 수치 적분법, 수치미분방정식 해법(룽게-쿠타 방법 등)을 구현하는 데에는 전적으로 Python 기본 메서드와 Numpy만으로 충분하다. 그렇지만 Scipy를 이용하면 Numpy만으로는 길게 코딩해야 하는 기법들을 단 2~3줄에 구현할 수 있다. 게다가 Numpy로 구현하기 막막하거나 사실상 불가능한 것들도 Scipy로는 쉽게 결과를 얻을 수 있다. 따라서 Numpy와 Scipy를 적절하게 혼용하게 되면 MATLAB 부럽지 않은 수치해석 툴을 얻은 셈이 된다.
  • Sympy (심파이 = 심볼 + 파이썬)
Python의 대표적인 기호계산 패키지인 Sympy도 Numpy와 잘 연동된다. 예컨대 Numpy만으로 구현하기 까다로운 함수의 경우, Sympy로 원하는 함수를 구하고, 이 함수를 바탕으로 Numpy를 이용하여 그 함수를 기반으로 배열형 자료를 구할 수 있다. 어떤 sympy 함수를 일단 구하기만 하면, f = sympy.lambdify(정의역 문자, sympy 함수, 'numpy') 꼴의 간단한 코딩만으로 Numpy에 적용가능한 함수 f를 얻을 수 있다. 여기에서 f(np.linspace(0,1, 101))를 입력하면 함수에 대해 0에서 1까지 100등분한 정의역 점들에 대한 함숫값들의 배열을 얻는다. 간혹 Numpy 자체나 Scipy만으로 구하기 어려운 함수도 Sympy로는 간결하게 구할 수 있는 경우도 많으므로 Numpy와 Sympy를 같이 배워두면 여러모로 쓸모가 많다.
  • Matplotlib
파이썬에서 널리 사용되는 그래픽 패키지인 Matplotlib에서도 Numpy는 자주 애용된다. 물론 파이썬에 기본적으로 내장된 리스트형 자료로도 충분히 수많은 종류의 데이터를 그래프화할 수 있다. 그러나 아무래도 Numpy를 쓸 때보다는 코드가 굉장히 복잡해지고, 그래프를 얻는 속도도 느리다. 실제로 인터넷 상의 Matplotlib 튜토리얼이나 예제들을 봐도 다들 Numpy의 ndarray 자료형을 쓰지 리스트형은 잘 쓰지 않는다. 당연하지만 Matplotlib를 기반으로 좀 더 유려한 그래프와 도표를 얻는 seaborn과 같은 패키지에도 굉장히 유용하게 쓰인다.
Pandas는 Numpy보다 더 복잡한 형태의 자료(Series, DataFrame)를 다루지만, Numpy를 이용해 만든 array 자료를 이용해서 Series나 DataFrame 자료를 생성하거나 수정할 수 있다.

실제로는 'Numpy + 다른 한 개의 패키지' 조합뿐만 아니라 'Numpy + 여러 개의 패키지' 조합을 쓸 때가 많다. 예컨대 Sympy로 함수의 라플라스 변환을 구하고, Numpy를 이용해서 변환한 함수의 값들에 대한 배열형 자료를 얻고, 이 배열형 자료를 바탕으로 Matplotlib을 써서 그래프를 그릴 수 있다.

3. 라이브러리에 포함된 함수

자세한 건 Document를 참고하고 검색창을 통해 검색하면 된다.

.array(object): 가장 기본적인 ndarray 생성 함수다. 보통 list형 데이터를 인자로 넘겨준다.

.zeros(int): int 개수만큼의 0으로 이루어진 ndarray를 만들어 준다. Np.zeros(10)은 (10,) 형태의 0으로 이루어진 벡터를 생성한다. 만약 특정한 형상으로 만들길 원한다면 int 대신 sequence를 [x, y]또는 (x, y)와 같이 넣어서 지정해주면 된다.

.arange(): 흔히 쓰이는 range 함수와 유사하다. 범위와 간격 설정이 가능. range와의 차이점은 range는 python 3.11 기준으로 range를 반환하고, arange는 ndarray를 반환한다. 형태와 차원을 원하는 대로 설정하고 싶으면 .reshape()를 쓰자.

.shape: 어떤 ndarray 뒤에 이걸 붙이면 그 ndarray의 형상을 출력한다.

.size: 차원 정보 없이 원소의 개수만을 출력한다.

.argmax(): 입력 값으로 들어온 ndarray의 각 행/열별 최댓값의 인덱스를 산출한다. 키워드 인자 axis=를 추가하면 열별(axis=0) 혹은 행별(axis=1) 최댓값 위치를 알 수 있다. 비슷하게 .argmin()도 존재한다.

.T: 벡터의 전치(transpose)를 수행한다. 단, 1차원 ndarray는 상황에 따라 행벡터 혹은 열벡터로 바뀌므로 굳이 T를 붙일 이유는 없다.

.linspace(시작값, 종료값, 간격 수): 시작값과 종료값 사이에 일정한 간격으로 간격 수 만큼의 사이즈의 ndarray을 생성해준다. 예를 들어 어떤 미분방정식을 t = 0 에서 t = 20 으로 60 fps씩 풀고 싶다면, timespan = np.linspace(0, 20, 1200) 이렇게 하면 생성할 수 있다. 그 다음 scipy.integrate.odeint와 같은 함수에다가 해당 ndarray와 미분방정식을 집어넣으면, 수치해석을 이용하여 각 지점마다 해당하는 값을 반환한다.
.unique(): 해당 ndarray에 어떤 값들이 있는지 알려준다. 예를 들어 np.unique([1, 2, 2, 3, 5, 5])라고 입력하면 [1, 2, 3, 5]가 출력된다.

.reshape(): ndarray를 원하는 차원/사이즈로 변경해준다. 예를 들자면, 딥러닝에서 CNN(Convolutional Neural Network)은 보통 (배치 사이즈)*(가로)*(세로)*(색깔 수)로 4D array 구조인데, 이를 나중에 evaluation 등에서 활용하기 위해 .flatten이나 {{{.reshape}}를 활용하여 1차원 ndarray로 펼칠 수 있다.

.sin(), .cos(), .tan(), .arcsin(), .arccos(), .arctan(): 삼각함수다. 입력값으로 radian 값을 사용하며, 역삼각함수의 반환값 역시 라디안 값이다. .rad2deg 또는 .deg2rad로 편리하게 degree 값을 사용할 수 있으니 일일이 원주율을 곱할 필요는 없다.

.sort(): ndarray를 입력한 축에 따라 정렬해 준다. 선택으로 정렬 방식을 직접 지정할 수 있다.

[1] 포트란의 속도논란 항목을 참조하라.