2 분 소요

NumPy


머신러닝의 주요 알고리즘은 선형대수와 통계 등에 기반한다. Numerical Python을 의미하는 넘파이(NumPy)는 벡터화 연산(vectorized operation)을 이용하여 파이썬에서 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 대표적인 패키지다. 루프를 사용하지 않고 대량 데이터의 배열 연산을 가능하게 하므로 빠른 배열 연산 속도를 보장한다. 대량 데이터 기반의 과학과 공학 프로그램은 빠른 계산 능력이 매우 중요해서 파이썬 기반의 많은 과학과 공학 패키지는 넘파이에 의존하고 있다.

NumPy에서 제공하는 것들은 다음과 같다.

  • 효율적인 다차원 배열인 ndarray는 빠른 배열 계산과 유연한 브로드캐스팅1 기능을 제공한다.

  • 반복문을 작성할 필요 없이 전체 데이터 배열을 빠르게 계산할 수 있는 표준 수학 함수

  • 배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구와 메모리에 적재된 파일을 다루는 도구

  • 선형대수, 난수 생성기, 푸리에 변환 기능

  • C, C++, 포트란으로 작성한 코드를 연결할 수 있는 C API

  • 배열 인덱싱(array indexing)을 사용한 질의(Query) 기능을 이용하여 간단한 코드로도 복잡한 수식 계산


넘파이는 또한 C/C++과 같은 저수준 언어 기반의 호환 API를 제공한다. 기존 C/C++ 기반의 타프로그램과 데이터를 주고받거나 API를 호출해 쉽게 통합할 수 있는 기능을 제공한다. 넘파이는 매우 빠른 배열 연산을 보장해 주지만, 파이썬 언어 자체가 가지는 수행 성능의 제약이 있으므로 수행 성능이 매우 중요한 부분은 C/C++기반의 코드로 작성하고 이를 넘파이에서 호출하는 방식으로 쉽게 통합할 수 있다. 이 기능은 파이썬으로 레거시 C, C++, 포트란 코드를 감싸서 동적이며 쉽게 사용할 수 있는 인터페이스를 만들 수 있도록 해준다. 구글의 대표적인 딥러닝 프레임워크인 텐서플로는 이러한 방식으로 배열 연산 수행 속도를 개선하고 넘파이와도 호환될 수 있게 작성됐다.

많은 머신러닝 알고리즘이 넘파이 기반으로 작성돼 있음은 물론이고, 이들 알고리즘의 입력 데이터와 출력 데이터를 넘파이 배열 타입으로 사용하므로 넘파이를 이해하는 것은 파이썬 기반의 머신러닝에서 매우 중요하다. 또한, 넘파이가 배열을 다루는 기본 방식을 이해하는 것은 다른 데이터 핸들링 패키지, 예를 들어 판다스를 이해하는 데도 많은 도움이 된다. 넘파이 자체는 모델링이나 과학 계산을 위한 기능을 제공하지 않으므로 먼저 넘파이 배열과 배열 기반 연산에 대한 이해를 한 다음 판다스 같은 배열 기반 도구를 사용하면 훨씬 더 효율적이다.

넘파이가 파이썬 산술 계산 영역에서 중요한 위치를 차지하는 이유 중 하나는 대용량 데이터 배열을 효율적으로 다룰 수 있도록 설계되었다는 점이다.

  • 넘파이는 내부적으로 데이터를 다른 내장 파이썬 객체와 구분된 연속된 메모리 블록에 저장한다. 넘파이의 각종 알고리즘은 모두 C로 작성되어 타입 검사나 다른 오버헤드 없이 메모리를 직접 조작할 수 있다. 넘파이 배열은 또한 내장 파이썬의 연속된 자료형들보다 훨씬 더 적은 메모리를 사용한다.

  • 넘파이 연산은 파이썬 반복문을 사용하지 않고 전체 배열에 대한 복잡한 계산을 수행할 수 있다.

성능 차이를 확인하기 위해 백만 개의 정수를 저장하는 NumPy 배열과 파이썬 리스트를 비교해보자.

import numpy as np # 넘파이 모듈 임포트

my_arr = np.arange(1000000) # 넘파이 배열
my_list = list(range(1000000)) # 파이썬 리스트
%time for _ in range(10): my_arr2 = my_arr * 2 # 단일 실행 시간을 출력해주는 매직 명령어
CPU times: total: 0 ns
Wall time: 9 ms
%time for _ in range(10): my_list2 = [x * 2 for x in my_list] # 단일 실행 시간을 출력해주는 매직 명령어
CPU times: total: 562 ms
Wall time: 547 ms

넘파이를 사용한 코드가 순수 파이썬으로 작성한 코드보다 열 배에서 백 배 이상 빠르고 메모리도 더 적게 사용하는 것을 확인할 수 있다.

관련 포스트 더 보기

  • NumPy02: ndarray, 인덱싱, 축
  • NumPy03: 유니버셜 함수, 배열지향 프로그래밍, 파일 입출력, 선형대수, 난수 생성
  • Advanced NumPy01: ndarray 객체 구조, 고급 배열 조작 기법, 브로드캐스팅, 고급 ufunc 사용법
  • Advanced NumPy02: 구조화된 배열과 레코드 배열, 정렬, 고급 배열 입출, 성능 팁
  • Example of going up and down stairs: 간단한 NumPy 실습
    1. 브로드캐스팅(Broadcasting)은 모양이 다른 배열들 간의 연산이 어떤 조건을 만족했을 때 가능해지도록 배열을 자동적으로 변환하는 것이라고 정의할 수 있다. 그리고 누락되었거나 길이가 1인 차원에 대해 브로드캐스팅이 수행된다. 출처: https://sacko.tistory.com/16 [데이터 분석하는 문과생, 싸코:티스토리] 

    댓글남기기