NumPy
NumPy![]() | |
원저작자 | 트래비스 올리판트 |
---|---|
개발자 | 커뮤니티 프로젝트 |
초기 릴리즈 | 수치로서 1995년 | NumPy로서 2006년(
안정된 릴리스 | |
저장소 | |
기입처 | Python, C |
운영 체제 | 크로스 플랫폼 |
유형 | 수치 분석 |
면허증. | BSD[3] |
웹 사이트 | numpy![]() |
NumPy(/ouncednˈmpa//(NUM-py) 또는 /ouncednpronmpi/([4][5]NUM-pee)로 발음됨)는 Python 프로그래밍 언어를 위한 라이브러리이며, 대규모 [6]다차원 배열 및 행렬을 지원하며 이러한 배열에서 작동하기 위한 높은 수준의 수학 함수 집합을 제공합니다.NumPy의 조상인 Numeric은 Jim Hugunin에 의해 여러 개발자들의 기고로 만들어졌습니다.2005년 Travis Oliphant는 경쟁사의 Numarray 기능을 Numarray에 통합하고 광범위한 수정을 가함으로써 NumPy를 만들었습니다.NumPy는 오픈 소스 소프트웨어이며 많은 기여자가 있습니다.NumPy는 재정적으로 후원하는 NumFOCUS 프로젝트입니다.[7]
역사
Python 프로그래밍 언어는 원래 수치 컴퓨팅용으로 설계되지 않았지만 초기에 과학계와 공학계의 관심을 끌었습니다.1995년에 어레이 컴퓨팅 패키지를 정의하기 위해 SIG 매트릭스 시그가 설립되었습니다.그 멤버 중에는 파이썬의 설계자이자 유지관리자인 Guido van Rossum이 있었습니다.그는 파이썬의 구문(특히 인덱싱[8] 구문)을 확장하여 어레이 컴퓨팅을 [9]쉽게 했습니다.
매트릭스 패키지의 구현은 Jim Fulton에 의해 완료되었고, Jim Hugunin에 의해 일반화되었고[further explanation needed] Numerical Python 확장자[9] 또는 "NumPy"[10][11]로 다양하게 알려져 있습니다.매사추세츠공대(MIT)[11]: 10 대학원생인 Hugunin은 1997년 JPython [9]연구를 위해 CNRI에 입사했으며, Lawrence Livermore National Laboratory(LLNL)의 Paul Dubois가 [11]: 10 관리직을 맡았습니다.다른 초기 기여자들로는 David Ascher, Konrad Hinsen, Travis Oliphant가 [11]: 10 있습니다.
Numarray라는 새로운 패키지는 Numarray를 [12]보다 유연하게 대체하기 위해 작성되었습니다.Numeric과 마찬가지로 Numeric도 [13][14]더 이상 사용되지 않습니다.Numarray는 대규모 어레이의 동작은 고속이었지만 소규모 [15]어레이의 동작은 수치보다 느렸습니다.따라서 한때는 두 패키지가 다른 사용 사례에 따라 병렬로 사용되었습니다.Numeric(v24.2)의 마지막 버전은 2005년 11월 11일에 출시되었으며 numarray(v1.5.2)의 마지막 버전은 2006년 [16]8월 24일에 출시되었습니다.
Numeric을 Python 표준 라이브러리에 넣고 싶었지만 Guido van Rossum은 그 당시 상태로서는 [when?][17]코드를 유지할 수 없다고 결정했다.
2005년 초 NumPy 개발자인 Travis Oliphant는 단일 어레이 패키지에 대한 커뮤니티 통합을 원했고 Numarray의 기능을 Numeric으로 이식하여 2006년 [12]NumPy 1.0으로 출시했습니다.이 새로운 프로젝트는 SciPy의 일부였다.어레이 오브젝트를 취득하기 위해서만 큰 SciPy 패키지를 인스톨 하는 것을 피하기 위해서, 이 새로운 패키지는 분리되어 NumPy라고 불리고 있습니다.Python 3에 대한 지원은 NumPy 버전 1.5.[18]0에서 2011년에 추가되었습니다.
2011년 PyPy는 [19]PyPy용 NumPy API 구현을 위한 개발을 시작했습니다.아직 NumPy와 [20]완전히 호환되지는 않습니다.
특징들
NumPy는 최적화되지 않은 바이트 코드 인터프리터인 Python의 CPython 참조 구현을 대상으로 합니다.이 버전의 Python용으로 작성된 수학적 알고리즘은 컴파일러 최적화가 이루어지지 않기 때문에 컴파일된 동등한 알고리즘보다 훨씬 느리게 실행됩니다.NumPy는 다차원 어레이와 함수 및 어레이에서 효율적으로 동작하는 연산자를 제공함으로써 저속 문제에 부분적으로 대처합니다.이러한 기능을 사용하려면 NumPy를 사용하여 일부 코드(주로 내부 루프)를 다시 작성해야 합니다.
Python에서 NumPy를 사용하면 [21]MATLAB에 버금가는 기능을 얻을 수 있으며, 대부분의 작업이 스칼라 대신 어레이나 매트릭스에서 작업하는 한 사용자가 빠른 프로그램을 쓸 수 있습니다.이에 비해, MATLAB은 특히 Simulink와 같은 많은 추가 툴박스를 자랑하며, NumPy는 본질적으로 보다 현대적이고 완전한 프로그래밍 언어인 Python과 통합되어 있습니다.또한 보완적인 Python 패키지도 사용할 수 있습니다. SciPy는 MATLAB와 같은 기능을 추가한 라이브러리이고 MATplotlib은 MATLAB와 같은 플롯 기능을 제공하는 플롯 패키지입니다.내부적으로 MATLAB와 NumPy는 모두 효율적인 선형 대수 계산을 위해 BLAS와 LAPACK에 의존한다.
널리 사용되는 컴퓨터 비전 라이브러리 OpenCV의 Python 바인딩은 NumPy 어레이를 사용하여 데이터를 저장하고 작동합니다.여러 채널을 가진 이미지는 단순히 3차원 배열로 표시되므로 다른 배열과의 인덱싱, 슬라이스 또는 마스킹은 이미지의 특정 픽셀에 매우 효율적으로 액세스할 수 있습니다.NumPy 어레이는 이미지, 추출된 특징점, 필터 커널 등의 범용 데이터 구조로서 프로그래밍 워크플로우와 디버깅을 대폭 간소화합니다.
ndarray 데이터 구조
NumPy의 핵심 기능은 ndarray, 즉 n차원 배열의 경우 데이터 구조입니다.이러한 어레이는 [12]메모리의 비스듬한 표시입니다.Python의 내장 리스트 데이터 구조와는 달리, 이러한 어레이는 균일한 타입으로 되어 있습니다.단일 어레이의 모든 요소는 같은 타입이어야 합니다.
이러한 배열은 데이터를 복사할 필요 없이 C/C++, Python 및 Fortran 확장 기능에 의해 할당된 메모리 버퍼에 대한 뷰를 제공할 수 있으며, 기존 수치 라이브러리와 어느 정도 호환성을 제공합니다.이 기능은 SciPy 패키지에 의해 이용되며, SciPy 패키지는 이러한 라이브러리(BLAS 및 LAPACK)의 많은 부분을 랩합니다.NumPy에는 메모리 매핑 및 [12]배열에 대한 지원이 포함되어 있습니다.
제한 사항
배열에 엔트리를 삽입하거나 추가하는 것은 Python의 목록만큼 불가능 합니다.그np.pad(...)
어레이를 확장하는 루틴은 실제로 원하는 쉐이핑 및 패딩 값의 새 어레이를 만들고 지정된 어레이를 새 어레이로 복사하여 반환합니다.NumPy'snp.concatenate([a1,a2])
작업은 실제로 두 어레이를 연결하지는 않지만 두 어레이의 엔트리가 차례로 채워진 새 어레이를 반환합니다.배열의 치수 재형성:np.reshape(...)
는 배열 내의 요소 수가 변경되지 않는 한 사용할 수 있습니다.이러한 상황은 NumPy의 배열이 연속된 메모리 버퍼의 뷰여야 한다는 사실에서 비롯됩니다.Blaze라고 하는 대체 패키지는 이 [22]제한을 극복하기 위해 시도합니다.
벡터화된 연산으로 표현될 수 없는 알고리즘은 일반적으로 느리게 실행되는데, 이는 "순수 파이썬"에서 구현되어야 하기 때문이다. 반면 벡터화된 알고리즘은 입력만큼 큰 임시 배열을 생성해야 하기 때문에 일부 연산의 메모리 복잡성을 상수에서 선형으로 증가시킬 수 있다.숫자 코드의 런타임 컴파일은 이러한 문제를 피하기 위해 여러 그룹에 의해 구현되었습니다. NumPy와 상호 운용되는 오픈 소스 솔루션은 다음과 같습니다.scipy.weave
, numexpr[23] 및 Numba.[24]시톤과 피트란은 이들에 대한 정적 컴파일 대안입니다.
현대의 대규모 과학 컴퓨팅 애플리케이션의 상당수는 NumPy 어레이의 용량을 초과하는 요건을 갖추고 있습니다.예를 들어 NumPy 어레이는 일반적으로 컴퓨터의 메모리에 로드되므로 대용량 데이터 세트를 분석하기에 용량이 부족할 수 있습니다.또한 NumPy 연산은 단일 CPU 상에서 실행된다.그러나 많은 선형 대수 연산은 CPU 클러스터 또는 GPU 및 TPU와 같은 많은 딥 러닝 애플리케이션에 의존하는 특수 하드웨어에서 실행함으로써 가속화할 수 있습니다.그 결과 최근 몇 년 동안 과학 파이썬 생태계에서 Dask(분산 어레이), TensorFlow(GPU) 또는 JAX(Jax)와 같은 몇 가지 대체 어레이 구현이 등장했습니다.인기 때문에 Numpy API의 서브셋을 구현하거나 이를 모방하는 경우가 많기 때문에 사용자는 최소한의 코드 변경만으로 어레이 [6]구현을 변경할 수 있습니다.Nvidia의 CUDA 프레임워크에 의해 가속화된 [25]CuPy라는 이름의 최근 도입된 라이브러리도 NumPy의 [26]'드롭인 대체'로서 보다 빠른 컴퓨팅의 가능성을 보여주고 있습니다.
예
어레이 작성
>>>수입품 수치 ~하듯이 np >>>x = np.배열([1, 2, 3]) >>>x 어레이([1, 2, 3]) >>>y = np.오렌지색(10) # Python 목록(range(10))과 비슷하지만 배열을 반환합니다. >>>y 어레이([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
기본 조작
>>>a = np.배열([1, 2, 3, 6]) >>>b = np.행간(0, 2, 4) # 0에서 시작하여 2로 끝나는 등간격의 4개의 점을 가진 배열을 만듭니다. >>>c = a - b >>>c array([1. , 1.333333, 1.6666667, 4]) >>>a**2 어레이([1, 4, 9, 36])
범용 함수
>>>a = np.행간(-np.파이, np.파이, 100) >>>b = np.죄(a) >>>c = np.왜냐하면(a) >>> >>># 함수는 숫자와 어레이를 모두 파라미터로 사용할 수 있습니다. >>>np.죄(1) 0.8414709848078965 >>>np.죄(np.배열([1, 2, 3])) 어레이([0.84147098, 0.90929743, 0.14012001)
선형 대수
>>>부터 numpy.discloss. 수입품 랜드 >>>부터 numpy.linalg 수입품 풀다, 초대하다 >>>a = np.배열([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]]) >>>a.전치하다() 어레이([1., 3., 5.]), [ 2. , 4. , 9. ], [ 3. , 6.7, 5. ]]) >>>초대하다(a) 어레이([-2.27683616, 0.96045198, 0.07909605]), [ 1.04519774, -0.56497175, 0.1299435 ], [ 0.39548023, 0.05649718, -0.11299435]]) >>>b = np.배열([3, 2, 1]) >>>풀다(a, b) # 방정식 ax = b를 푼다. 어레이([-4.83050847, 2.13559322, 1.14068]) >>>c = 랜드(3, 3) * 20 # [0,1] 내에서 20으로 스케일링된 3x3 랜덤 값 매트릭스 생성 >>>c 어레이([3.98732789, 2.47702609, 4.71167924]), [ 9.24410671, 5.5240412 , 10.6468792 ], [ 10.38136661, 8.44968437, 15.17639591]]) >>>np.점(a, c) 행렬 곱셈 수 어레이([53.61964114, 38.8741616, 71.53462537]), [ 118.4935668 , 86.14012835, 158.40440712], [ 155.04043289, 104.3499231 , 195.26228855]]) >>>a @ c # Python 3.5 및 NumPy 1.10 이후 어레이([53.61964114, 38.8741616, 71.53462537]), [ 118.4935668 , 86.14012835, 158.40440712], [ 155.04043289, 104.3499231 , 195.26228855]])
텐서
>>>M = np.제로(모양.=(2, 3, 5, 7, 11)) >>>T = np.전치하다(M, (4, 2, 1, 3, 0)) >>>T.모양. (11, 5, 3, 7, 2)
OpenCV와의 통합
>>>수입품 수치 ~하듯이 np >>>수입품 cv2 >>>r = np.모양을 바꾸다(np.오렌지색(256*256)%256,(256,256)) # 256 x 256 픽셀 어레이 (빨간색 채널은 0 ~255 수평구배) >>>g = np.0과 같은(r) r과 크기 및 유형이 같지만 녹색 채널은 0으로 채워진 배열 수 >>>b = r.T # 전치된 r은 파란색 채널에서 수직 구배를 제공합니다. >>>cv2.기입하다('png.png', np.스택([b,g,r])) # OpenCV 이미지는 BGR로 해석되며 깊이 적층 어레이는 'gradients.png'라는8비트 RGB PNG 파일에 기록됩니다. 진실의
가장 가까운 네이버 검색
반복 Python 알고리즘 및 벡터화된 NumPy 버전.
>>># # 순수 반복 Python # # # # >>>포인트 = [[9,2,8],[4,7,2],[3,4,4],[5,6,9],[5,0,7],[8,2,7],[0,3,2],[7,3,0],[6,1,1],[2,9,6]] >>>q포인트 = [4,5,3] >>>minIdx = -1 >>>최소 거리 = -1 >>>위해서 idx, 포인트 에 열거하다(포인트): # 모든 포인트에서 반복 ... 일그러뜨리다 = 합([(에서-dq)**2 위해서 에서,dq 에 지퍼(포인트,q포인트)])**0.5 # q까지의 각 점의 유클리드 거리를 계산합니다. ... 한다면 일그러뜨리다 < > 최소 거리 또는 최소 거리 < > 0: # 필요한 경우 해당 지점의 최소 거리 및 색인을 업데이트합니다. ... 최소 거리 = 일그러뜨리다 ... minIdx = idx >>>인쇄물('Q에 가장 가까운 지점:{0}'.포맷(포인트[minIdx])) Q에 가장 가까운 점: [3, 4, 4] >>># # # 등가 NumPy 벡터화 # # # # >>>수입품 수치 ~하듯이 np >>>포인트 = np.배열([[9,2,8],[4,7,2],[3,4,4],[5,6,9],[5,0,7],[8,2,7],[0,3,2],[7,3,0],[6,1,1],[2,9,6]]) >>>q포인트 = np.배열([4,5,3]) >>>minIdx = np.argmin(np.라이날.규범(포인트-q포인트,축.=1)) # 모든 유클리드 거리를 한 번에 계산하고 가장 작은 것의 색인을 반환합니다. >>>인쇄물('Q에 가장 가까운 지점:{0}'.포맷(포인트[minIdx])) Q에 가장 가까운 점: [3 4 4]
F2PY
네이티브 코드를 빠르게 랩하여 스크립트를 [27][28][29]고속화합니다.
! Python Fortran 네이티브코드 호출 예시 ! f2py -c -m foo *.f90 ! intent 문을 사용하여 Fortran을 python 명명 모듈로 컴파일합니다. ! Fortran 서브루틴만 기능하지 않음 - C 래퍼 탑재 JNI보다 간단함 ! gfortran과 make가 필요합니다. 서브루틴테스트(a, b, n, c, d) 암묵적 없음 정수, 의도(에) :: a 정수, 의도(에) :: b 정수, 의도(에) :: n 정수, 의도(나가.) :: c 정수, 의도(나가.) :: d 정수 :: i c = 0 하다i = 1, n c = a + b + c end do를 하다 d = (c * n) * (-1) 엔드 서브루틴테스트
>>>수입품 수치 ~하듯이 np >>>수입품 후우 >>>a = 후우.테스트(1, 2, 3) a.c 및 a.d 대신 # 또는 c,d = >>>인쇄물(a) >>>(9,-27) >>>도와 주세요.('foo.ftest') # foo.ftest.__doc__
「 」를 참조해 주세요.
레퍼런스
- ^ "Release v1.23.1".
- ^ "Releases – numpy/numpy". Retrieved 8 July 2022 – via GitHub.
- ^ "NumPy — NumPy". numpy.org. NumPy developers.
- ^ Pine, David (2014). "Python resources". Rutgers University. Retrieved 2017-04-07.
- ^ "How do you say numpy?". Reddit. 2015. Retrieved 2017-04-07.
- ^ a b Charles R Harris; K. Jarrod Millman; Stéfan J. van der Walt; et al. (16 September 2020). "Array programming with NumPy" (PDF). Nature. 585 (7825): 357–362. doi:10.1038/S41586-020-2649-2. ISSN 1476-4687. PMC 7759461. PMID 32939066. Wikidata Q99413970.
- ^ "NumFOCUS Sponsored Projects". NumFOCUS. Retrieved 2021-10-25.
- ^ "Indexing — NumPy v1.20 Manual". numpy.org. Retrieved 2021-04-06.
- ^ a b c Millman, K. Jarrod; Aivazis, Michael (2011). "Python for Scientists and Engineers". Computing in Science and Engineering. 13 (2): 9–12. Bibcode:2011CSE....13b...9M. doi:10.1109/MCSE.2011.36. Archived from the original on 2019-02-19. Retrieved 2014-07-07.
- ^ Travis Oliphant (2007). "Python for Scientific Computing" (PDF). Computing in Science and Engineering. Archived from the original (PDF) on 2013-10-14. Retrieved 2013-10-12.
- ^ a b c d David Ascher; Paul F. Dubois; Konrad Hinsen; Jim Hugunin; Travis Oliphant (1999). "Numerical Python" (PDF).
- ^ a b c d van der Walt, Stéfan; Colbert, S. Chris; Varoquaux, Gaël (2011). "The NumPy array: a structure for efficient numerical computation". Computing in Science and Engineering. IEEE. 13 (2): 22. arXiv:1102.1523. Bibcode:2011CSE....13b..22V. doi:10.1109/MCSE.2011.37. S2CID 16907816.
- ^ "Numarray Homepage". Retrieved 2006-06-24.
- ^ Travis E. Oliphant (7 December 2006). Guide to NumPy. Retrieved 2 February 2017.
- ^ Travis Oliphant and other SciPy developers. "[Numpy-discussion] Status of Numeric". Retrieved 2 February 2017.
- ^ "NumPy Sourceforge Files". Retrieved 2008-03-24.
- ^ "History_of_SciPy - SciPy wiki dump". scipy.github.io.
- ^ "NumPy 1.5.0 Release Notes". Retrieved 2011-04-29.
- ^ "PyPy Status Blog: NumPy funding and status update". Retrieved 2011-12-22.
- ^ "NumPyPy Status". Retrieved 2013-10-14.
- ^ The SciPy Community. "NumPy for Matlab users". Retrieved 2 February 2017.
- ^ "Blaze Ecosystem Docs". Read the Docs. Retrieved 17 July 2016.
- ^ Francesc Alted. "numexpr". Retrieved 8 March 2014.
- ^ "Numba". Retrieved 8 March 2014.
- ^ Shohei Hido - CuPy: A NumPy-compatible Library for GPU - PyCon 2018, archived from the original on 2021-12-21, retrieved 2021-05-11
- ^ Entschev, Peter Andreas (2019-07-23). "Single-GPU CuPy Speedups". Medium. Retrieved 2021-05-11.
- ^ "F2PY docs from NumPy". NumPy. Retrieved 18 April 2022.
- ^ Worthey, Guy. "A python vs. Fortran smackdown". Guy Worthey. Guy Worthey. Retrieved 18 April 2022.
- ^ Shell, Scott. "Writing fast Fortran routines for Python" (PDF). UCSB Engineering Department. University of California, Santa Barbara. Retrieved 18 April 2022.
추가 정보
- Bressert, Eli (2012). Scipy and Numpy: An Overview for Developers. O'Reilly. ISBN 978-1-4493-0546-8.
- McKinney, Wes (2017). Python for Data Analysis : Data Wrangling with Pandas, NumPy, and IPython (2nd ed.). Sebastopol: O'Reilly. ISBN 978-1-4919-5766-0.
- VanderPlas, Jake (2016). "Introduction to NumPy". Python Data Science Handbook: Essential Tools for Working with Data. O'Reilly. pp. 33–96. ISBN 978-1-4919-1205-8.