본문 바로가기
Python/NumPy

넘파이(NumPy) 개요 - NumPy(1)

by 콩돌 2019. 1. 13.
반응형

참고 자료

https://docs.scipy.org/doc/numpy/user/whatisnumpy.html



NumPy의 개요


Numpy는 파이썬에서 과학계산을 위한 기본 패키지이다.
Numpy를 이용하면 다차원 배열 객체와 다양한 객체(masked array and matrix)에 대해 고속 연산을 가능하게 하다.
NumPy에서는 랜덤시뮬레이션, 기본적인 통계학 연산, 기본 선형대수학, 이산 푸리에 변환, I/O, 선택, 정렬, 형상처리, 수학, 논리 등에 대해 계산수행이 가능하다.


NumPy 특징

Numpy의 핵심 기능은 ndarray 객체이다.

ndarray 객체는 동일한 자료형의 n-차원의 배열을 모아주는 역할을 한다.

성능을 개선하기 위해  많은 연산이 컴파일된 코드에서 수행되어진다.

NumPy는 ndarray를 사용하여 전적으로 객체지향형  접근법을 지원한다. 



NumPy와 파이썬 내장 자료형간의 차이점

파이썬 내장 시퀀스형 타입과 Numpy 배열에는 몇 가지 중요한 차이점이 있고, NumPy 배열에는 큰 특징이 있다.

  - 파이썬 리스트형 자료형과는 다르게 Numpy 배열은 생성될 때 고정된 크기의 배열을 가진다. Numpy의 배열을 바꿀 때에는 새로운 배열을 만들고 기존의 배열을 지워야한다.

  - NumPy 배열 속에 요소들은 모두 같은 자료형이며, 같은 메모리를 가진다. 예외적으로, 객체의 배열일 경우에는 배열 요소는 서로 다른 크기를 가지는 요소가 사용되어질 수 있다.

  - NumPy 배열은 많은 수의 데이터를 활용할 때 고급 수학 및 기타 유형의 연산을 용이하게한다. 일반적으로 이런 작업은 파이썬의 내장 시퀀스형 자료형을 사용하는 것보다 더 효율적이고 코드가 적게 실행된다.

  - 파이썬을 기반으로 한 많은 과학 및 수학연산 패키지은 NumPy 배열을 활용하고 있다. 몇몇 패키지에서는 파이썬 내장 자료형을 활용 하더라도 NumPy 배열로 바꾸어 연산을 수행하며, 종종 출력까지 NumPy 배열일 경우가 있다. 바꿔말하면, 효율적으로 파이썬 기반의 소프트웨어를 사용하여 과학 및 수학 계산을 수행하기 위해서는, 파이썬의 내장 기능만 아는 것은 충분하지 않고, NumPy 배열까지 배워야 할 필요성이 있다는 것이다.


NumPy가 효율적인 면을 보여줄 수 있는 예가 하나 있는데, 1차원의 a 행렬과 b 행렬 간의 같은 인덱스를 가지는 요소끼리의 곱의 행렬을 구하고자 할때 파이썬의 기본적인 기능만 활용한다면 다음과 같이 복잡하게 코드를 작성해야하고, 계산속도도 느리다.


# a b 는 같은 요소수를 가지는 행렬이라고 가정한다.

c = []

for i in range(len(a)): c.append(a[i]*b[i])


하지만 NumPy로 계산을 수행할 경우 다음과 같은 매우 단순한 코드 한줄이면 충분하며(다차원 배열에서도 가능하다.), 연산속도도 c언어에 근접 할 만큼 훨씬 빠르다.


c = a * b



벡터화(Vectorization)와 브로드캐스팅(Broadcasting)

위의 예제에서는 NumPy의 2가지 특징이라고 할 수 있는 벡터화와 브로드캐스팅의 강점을 설명해주는 예제이기도 하다.


벡터화

먼저 벡터화는 for구문과 같은 반복 구문과 인덱싱, 그리고 그 외의 기타사항을 생략할 수 있게한다. 물론 이런 작업은 최적화되고 미리 컴파일된 C 코드를 활용하기 때문에 가능하다. 

벡터화된 코드는 아래와 같은 많은 장점을 가진다.

  - 벡터화된 코드는 더 간결하며 읽기 쉽다.

  - 코드의 적은 줄 수는 일반적으로 더 버그가 적다는 것을 의미한다.

  - 벡터화된 코드는 수학적 표기법과 상당히 유사하다.

    (코드의 수학적 코드를 쉽고, 정확하게 만들어 준다.)

  - 백터화는 결과적으로 더 파이썬 답게 만들어 준다. 벡터화없이 작성된 코드는 for 루프에 의해 비효율적이며 읽기가 더 복잡해진다.


브로드캐스팅

브로드캐스팅은 요소별 동작을 설명하기 위한 용어인데, 일반적으로 NumPy에서 산술연산 뿐만이 아니라 논리연산, 비트연산, 함수동작 등의 모든 연산은 요소별 방식으로 작동한다. 

위의 예제에서  a와 b는 같은 형태의 다차원 배열, 하나의 스칼라로 구성된 배열이어야 한다. 만약 같은 형태의 다차원 배열이 아니라면, 두 개의 배열은 더 적은 수의 배열이 큰 수의 배열로 확장 가능한 형태이어야 한다.

약산 설명이 모호할 수 있는데, 만약 브로드캐스팅의 자세한 설명이 필요하다면 이 곳(링크)을 참고할 수 있다.


반응형

댓글