Skip to content

파이썬 라이브러리 numpy #

Find similar titles

6회 업데이트 됨.

Edit

NumPy란? #

파이썬 언어를 위한 선형대수용 행렬, 벡터 수학 계산을 위한 자료구조와 계산 함수를 제공하는 라이브러리이다. C, Fortran으로 작성된 함수를 파이썬으로 연동하여 쓸 수 있도록 구성되어 있다. 기본적으로 array라는 자료구조를 제공한다. 보통 과학용 일반 함수 목록을 제공하는 SciPy, 차트용 라이브러리인 Matplotlib, 고수준 DataFrame 제공 모듈인 pandas와 함께 사용된다.

파이썬 프로그램이 일반적으로 C에 비해 느린 이유는 for 루프 때문인데, NumPy의 벡터 연산을 이용하면 for 루프 없이 빠르게 동작하는 코드를 작성할 수 있다.

제공하는 선형대수 계산 함수는 다음과 같다.

  • diag: diagonal elements
  • dot: matrix multiplication
  • trace: sum of the diagonal elements
  • det: matrix determinant
  • eig: eigenvalues and eigenvectors
  • inv: Invertible matrix
  • pinv: Moore–Penrose pseudoinverse
  • qr: QR decomposition
  • svd: Singular value decomposition
  • solve: solve the linear system
  • listsq: least-squares solution

배열(ndarray) #

일반적인 다차원 데이터를 저장할 경우 사용한다. 파이썬 일반 데이터형인 리스트, 튜플은 다양한 데이터 형을 배열로 담을 수 있지만, ndarray는 하나의 데이터형만을 저장할 수 있다. ndarray를 사용하는 이유는 다음과 같다.

  • ndarray는 NumPy에서 지원하는 표준형 벡터/행렬/텐서를 저장한다.
  • 많은 NumPy 함수가 matrix가 아닌 ndarray를 반환한다.
  • 요소간 연산과 선형대수 연산에 대해 명확히 구분되어 있다.

행렬곱을 수행할 때는 .dot 메쏘드를 써야 한다. 반면 matrix의 경우 그냥 '*'이 행렬곱을 의미한다.

행렬(matrix) #

행렬연산을 위해 고안된 범용 2차원 배열이다. ndarray와의 차이점은 다음과 같다.

  • 연산자 *, dot(), multiply()
  • 벡터와 1차 배열
  • ndarray는 다차원이지만 matrix는 2차원이다.

NumPy 공식 문서에서 더 이상 matrix 클래스는 사용하지 않는 것을 권장한다. 그 이유는 아래와 같다.

  • NumPy는 특정 수학 분야에 속하는 것이 아닌 범용적인 사용을 위해 설계되었지만, matrix class는 예외로 선형 대수학에서의 활용을 위해 작성되었다. 즉, matrix class는 numPy의 목적과 전혀 다를뿐더러 선형 대수학에서도 큰 활용성을 보여주지 못했다.
  • NumPy의 하위클래스와의 종속성을 방해하며, nd-array와 matrix를 혼합하여 사용 시 혼란을 야기한다.
  • array class의 행렬연산이 도입되었다.

이 외에도 많은 이유가 있지만 너무 많기 때문에 생략하겠다. 사용자를 위해서 작성된 클래스가 오히려 사용자들에 의해 사라지게 된 것이다.
실제로 NumPy 라이브러리 사용자들이 오래전부터 지원 중단에 대해서 제안을 했지만 이에 대한 해결은 2015년 9월로 꽤 오랜 시간이 소요되었다.
matrix의 역사를 살펴보면 정말 수많은 사람들이 고민하고 의논한 결과 최적의 결과가 나왔다는 것을 알 수 있다.

  • 지원 중단에 대한 제안에 대해 2009년 NumPy측에서 논의와 아이디어, 개선 방법에 대해 협의는 이루어졌지만 그럴만한 동기가 없다고 판단하여 보류되었다.
    • NumPy 측에서는 행렬연산에 있어 matrix만큼 최적화된 클래스는 없다고 판단하였다.
  • 하지만 여전히 사용자들은 불편함에 대해 논의를 하고 있으며, 2014년에 matrix가 nd-array의 규칙을 엉망으로 만들고 있어 존재만으로 악행을 저지르고 있다며 다시 한 번 문제가 제기되었다.
    • NumPy 측에서 해당 문제를 적극 수용하여 해결하기 위해 중위 연산자 도입을 결정하였다.
  • NumPy 사용자들은 중위 연산자의 도입으로 인해 nd-array 클래스에서도 행렬연산이 가능하게 되었지만, matrix가 아직 numPy 하위 클래스가 존재하는 것을 지적했다. 사용자들은 matrix와 numPy를 완전히 분리해야 새로운 사용자들을 올바른 길로 인도할 수 있다고 제안했다.
    • NumPy 측에서 해당 사항은 인지하여 2017년 11월 말 첫 번째 지원 중단 조치가 취해졌다.
  • 지원 중단 조치에 대해 사용자들은 또 다른 문제점을 제시하였는데, 만약 지원을 중단하게 될 경우 matrix 클래스를 사용 중인 코드들(scipy.sparse matrix)에 대한 처리에 대한 방법을 의논하였다.
    • 연산자를 도입한지 얼마 되지 않아 nd-array가 충분히 구체화 되기 전까지는 matrix 클래스가 유지되어야 한다고 제시했으며 그렇기 때문에 matrix는 삭제하는 것이 아닌 이동 해야 한다고 답했다.
  • Numpy측에서 공식적으로 matrix 클래스를 더 이상 지원하는 것으로 결정하였고, matrix 클래스를 종속하고 있는 scipy.sparse와 scikit-learn은 새로운 API로 전환할 것을 권장하였다.
    • 새로운 프로젝트의 경우 nd-array 클래스를 사용할 것을 권장하며, 변화가 어려운 기존 프로젝트를 위해 matrix는 별도 패키지로 제공하는 것을 목표로 두고 있다.

Suggested Pages #

0.0.1_20240214_1_v81