NumPy 넘파이(넘피) | |
버전 | 2.1.3 2024년 11월 2일 업데이트 |
웹사이트 | 공식 홈페이지 pypi |
[clearfix]
1. 개요
Numarray와 Numeric이라는 오래된 Python 패키지를 계승해서 나온 수학 및 과학 연산을 위한 파이썬 패키지이다. Py는 파이썬을 나타내기 때문에, 일반적으로 넘파이라고 읽는다.프로그래밍 하기 어려운 C, C++, Fortran[1] 등의 언어에 비하면, NumPy로는 꽤나 편리하게 수치해석을 실행할 수 있다. 게다가 NumPy 내부는 상당부분 C나 포트란으로 작성되어 실행 속도도 꽤 빠른편이다. 기본적으로 ndarray라는 자료를 생성하고 이를 바탕으로 색인, 처리, 연산 등을 하는 기능을 수행한다. 물론 넘파이 자체만으로도 난수생성, 푸리에변환, 행렬연산, 간단한 기술통계 분석 정도는 가능하지만 실제로는 SciPy, Pandas, matplotlib 등 다른 Python 패키지와 함께 쓰이는 경우가 많다.
파이썬으로 수치해석, 통계 관련 기능을 구현한다고 할 때 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(numpy.linspace(0,1, 101))
를 입력하면 함수에 대해 0에서 1까지 100등분한 정의역 점들에 대한 함숫값들의 배열을 얻는다. 간혹 NumPy 자체나 SciPy만으로 구하기 어려운 함수도 SymPy로는 간결하게 구할 수 있는 경우도 많으므로 NumPy와 SymPy를 같이 배워두면 여러모로 쓸모가 많다.
- Matplotlib
파이썬에서 널리 사용되는 그래픽 패키지인 Matplotlib에서도 NumPy는 자주 애용된다. 물론 파이썬에 기본적으로 내장된 리스트형 자료로도 충분히 수많은 종류의 데이터를 그래프화할 수 있다. 그러나 아무래도 NumPy를 쓸 때보다는 코드가 굉장히 복잡해지고, 그래프를 얻는 속도도 느리다. 실제로 인터넷 상의 Matplotlib 튜토리얼이나 예제들을 봐도 다들 NumPy의 ndarray 자료형을 쓰지 리스트형은 잘 쓰지 않는다. 당연하지만 Matplotlib를 기반으로 좀 더 유려한 그래프와 도표를 얻는 seaborn과 같은 패키지에도 굉장히 유용하게 쓰인다.
- Pandas
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를 반환한다. 'arange'는 "array range"를 줄여쓴 거라고 생각하면 된다. 형태와 차원을 원하는 대로 설정하고 싶으면.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로 펼칠 수 있다..trace()
: 대각합을 계산한다. 특정 band의 합을 구하고자 할 경우에는 np.trace(,offset=)에서 등호 뒤에 구하고자 하는 band idx를 넣으면 된다..sin()
,.cos()
,.tan()
,.arcsin()
,.arccos()
,.arctan()
: 삼각함수다. 입력값으로 radian 값을 사용하며, 역삼각함수의 반환값 역시 라디안 값이다..rad2deg
또는.deg2rad
로 편리하게 degree 값을 사용할 수 있으니 일일이 원주율을 곱할 필요는 없다..sort()
: ndarray를 입력한 축에 따라 정렬해 준다. 선택으로 정렬 방식을 직접 지정할 수 있다.