NumPy(발음: NUM-py)는 Python 프로그래밍 언어용 라이브러리로, 대규모 다차원 배열과 행렬에 대한 지원과 이러한 배열을 연산하기 위한 고수준 수학 함수 모음을 추가한다. 이는 많은 기여자가 있는 오픈소스 소프트웨어이며 NumFOCUS의 재정적 후원을 받는다. NumPy는 과학적 Python 생태계의 핵심 구성 요소로, SciPy 및 Matplotlib와 같은 라이브러리를 뒷받침하며 데이터 분석에서 머신 러닝 및 딥 러닝에 이르는 다양한 분야에서 널리 사용된다.
NumPy의 전신인 Numeric은 원래 Jim Hugunin이 여러 다른 개발자의 기여로 만들었다. 2005년 Travis Oliphant는 경쟁 패키지인 Numarray의 기능을 Numeric에 통합하고 광범위한 수정을 거쳐 NumPy를 만들었다. 첫 번째 릴리스인 NumPy 1.0은 2006년에 나왔다. 이후 NumPy는 Python 3 지원(2011년 버전 1.5.0부터 시작)으로 발전했으며 Python에서 수치 계산을 위한 표준 도구가 되었다.
역사
Python 프로그래밍 언어는 원래 수치 계산용으로 설계되지 않았지만 초기에 과학 및 공학 커뮤니티의 관심을 끌었다. 1995년 특별 관심 그룹인 matrix-sig가 배열 계산 패키지를 정의할 목적으로 설립되었다. 그 구성원 중에는 Python 설계자이자 유지 관리자인 Guido van Rossum이 있었으며, 그는 특히 인덱싱 구문을 확장하여 배열 계산을 더 쉽게 만들었다.
행렬 패키지의 구현은 Jim Fulton이 완성했고, 이후 Jim Hugunin이 다차원 배열을 지원하도록 확장하여 Numeric(또한 "Numerical Python extensions" 또는 "NumPy"로 알려짐)이라고 불렀다. 매사추세츠 공과대학(MIT)의 대학원생이었던 Hugunin은 1997년 JPython 작업을 위해 국립 연구 이니셔티브 공사(CNRI)에 합류하여 로렌스 리버모어 국립 연구소(LLNL)의 Paul Dubois가 유지 관리자로 인수하게 했다. 다른 초기 기여자로는 David Ascher, Konrad Hinsen, Travis Oliphant가 있었다.
Numarray라는 새 패키지가 Numeric의 더 유연한 대체품으로 작성되었다. 이는 큰 배열에서 더 빠른 연산을 제공했지만 작은 배열에서는 느렸으므로 한동안 두 패키지가 다양한 사용 사례에 대해 병렬로 사용되었다. Numeric의 마지막 버전(v24.2)은 2005년 11월 11일에 릴리스되었고, numarray의 마지막 버전(v1.5.2)은 2006년 8월 24일에 릴리스되었다. Numeric을 Python 표준 라이브러리에 포함하려는 바람이 있었지만 Guido van Rossum은 당시 상태에서 코드를 유지 관리할 수 없다고 결정했다.
2005년 초 Travis Oliphant는 커뮤니티를 단일 배열 패키지로 통합하려고 했다. 그는 Numarray의 기능을 Numeric에 이식하고 결과를 2006년 NumPy 1.0으로 릴리스했다. 이 새 프로젝트는 SciPy의 일부였지만 배열 객체를 얻기 위해 큰 SciPy 패키지를 설치하지 않도록 분리되어 NumPy라고 불렸다. 2011년 PyPy는 PyPy용 NumPy API 구현 개발을 시작했으며 2023년 현재 NumPy와 완전히 호환되지 않는다.
기능
NumPy는 비최적화 바이트코드 인터프리터인 CPython 참조 구현을 대상으로 한다. 이 버전의 Python용으로 작성된 수학 알고리즘은 컴파일러 최적화가 없기 때문에 컴파일된 등가물보다 훨씬 느리게 실행되는 경우가 많다. NumPy는 다차원 배열과 배열에서 효율적으로 작동하는 함수 및 연산자를 제공하여 이러한 느림을 부분적으로 해결한다. NumPy를 사용하려면 일부 코드, 특히 내부 루프를 배열을 사용하도록 다시 작성해야 한다.
Python에서 NumPy를 사용하면 MATLAB과 유사한 기능을 제공한다. 둘 다 해석 언어이며 대부분의 연산이 스칼라 대신 배열이나 행렬에서 작동하는 한 사용자가 빠른 프로그램을 작성할 수 있기 때문이다. MATLAB은 특히 Simulink와 같은 많은 추가 툴박스를 자랑하는 반면, NumPy는 더 현대적이고 완전한 프로그래밍 언어인 Python과 본질적으로 통합된다. 보완적인 Python 패키지가 제공된다. SciPy는 더 많은 MATLAB 유사 기능을 추가하고 Matplotlib는 MATLAB 유사 플로팅을 제공한다. MATLAB은 희소 행렬 연산을 수행할 수 있지만 NumPy만으로는 불가능하며 scipy.sparse 라이브러리를 사용해야 한다. 내부적으로 MATLAB과 NumPy 모두 효율적인 선형 대수 계산을 위해 BLAS 및 LAPACK에 의존한다.
널리 사용되는 컴퓨터 비전 라이브러리인 OpenCV의 Python 바인딩은 NumPy 배열을 사용하여 데이터를 저장하고 연산한다. 다중 채널 이미지는 단순히 3차원 배열로 표현되므로 다른 배열로 인덱싱, 슬라이싱 또는 마스킹하는 것이 특정 픽셀에 액세스하는 효율적인 방법이다. OpenCV에서 이미지, 추출된 특징점, 필터 커널 등을 위한 범용 데이터 구조로서의 NumPy 배열은 프로그래밍 워크플로우와 디버깅을 단순화한다. 중요하게도 많은 NumPy 연산은 전역 인터프리터 잠금을 해제하여 다중 스레드 처리를 허용한다. NumPy는 또한 C API를 제공하여 Python 코드가 저수준 언어로 작성된 외부 라이브러리와 상호 운용할 수 있게 한다.
ndarray 데이터 구조
NumPy의 핵심 기능은 "ndarray"(n차원 배열) 데이터 구조이다. 이러한 배열은 메모리에 대한 스트라이드 뷰이다. Python의 내장 리스트 데이터 구조와 대조적으로 배열은 동질적으로 유형이 지정된다. 단일 배열의 모든 요소는 동일한 유형이어야 한다. 이러한 배열은 데이터를 복사하지 않고 CPython 인터프리터에 대한 C/C++, Python 및 Fortran 확장에 의해 할당된 메모리 버퍼에 대한 뷰일 수도 있어 기존 수치 라이브러리와의 호환성을 제공한다. 이 기능은 여러 그러한 라이브러리(특히 BLAS 및 LAPACK)를 래핑하는 SciPy 패키지에서 활용된다. NumPy에는 메모리 매핑된 ndarray에 대한 내장 지원이 있다.
제한 사항
배열에 항목을 삽입하거나 추가하는 것은 Python의 리스트만큼 간단하게 가능하지 않다. 배열을 확장하는 np.pad 루틴은 실제로 원하는 모양과 패딩 값의 새 배열을 만들고 주어진 배열을 새 배열에 복사한 다음 반환한다. 마찬가지로 np.concatenate([a1, a2])는 두 배열을 연결하지 않고 두 배열의 항목으로 채워진 새 배열을 반환한다. np.reshape로 배열의 차원을 재구성하는 것은 요소 수가 변경되지 않는 경우에만 가능하다. 이러한 상황은 NumPy 배열이 연속 메모리 버퍼에 대한 뷰여야 한다는 사실에서 비롯된다.
벡터화된 연산으로 표현할 수 없는 알고리즘은 "순수 Python"으로 구현해야 하므로 일반적으로 느리게 실행되는 반면, 벡터화는 임시 배열이 입력만큼 커야 하므로 일부 연산의 메모리 복잡성을 상수에서 선형으로 증가시킬 수 있다. 이러한 문제를 피하기 위해 여러 그룹이 수치 코드의 런타임 컴파일을 구현했다. NumPy와 상호 운용되는 오픈소스 솔루션에는 numexpr 및 Numba가 포함된다. Cython 및 Pythran은 NumPy 기반 코드를 가속화할 수 있는 정적 컴파일 옵션이다.
응용 및 영향
NumPy는 많은 과학 및 데이터 중심 분야의 기초이다. 이는 머신 러닝 프레임워크와 라이브러리를 구동하는 배열 연산을 제공하며, TensorFlow 및 PyTorch와 같은 것들이 신경망 모델과 트랜스포머 아키텍처를 구축하는 데 사용된다. 인공 지능 연구에서 NumPy 배열은 데이터 전처리, 특징 추출 및 알고리즘을 처음부터 구현하는 데 자주 사용된다. 이 라이브러리의 효율성과 유연성은 MIT 및 Stanford에서 Google 및 Amazon과 같은 회사에 이르기까지 학계 및 산업 환경에서 표준 도구가 되었다.
NumPy의 영향은 전통적인 과학 컴퓨팅을 넘어 확장된다. 이는 컴퓨터 비전의 이미지 처리, 자연어 처리의 단어 임베딩 처리, 강화 학습의 상태 공간 관리에 사용된다. OpenCV 및 기타 라이브러리와의 통합은 Waymo 및 Tesla와 같은 회사가 개발한 로봇 공학 및 자율 시스템의 워크플로우를 간소화했다. 2023년 현재 NumPy는 가장 많이 다운로드된 Python 패키지 중 하나로 남아 있으며, 이는 현대 컴퓨팅 생태계에서의 중심 역할을 반영한다.