넘파이 1편

주요 내용

기본 설정

numpy 모듈과 시각화 도구 모듈인 matplotlib.pyplot에 대한 기본 설정을 지정한다.

넘파이(numpy)란? (p. 133)

넘파이(numpy)는 numerical python의 줄임말이며, 파이썬 데이터 과학에서 가장 중요한 도구를 제공하는 패키지이다. 넘파이가 제공하는 가장 중 요소는 아래 두 가지이다.

넘파이의 기능을 잘 이해한다면 이어서 다룰 pandas 패키지가 지원하는 모델링이나 통계 등 데이터 과학에 필요한 도구를 매우 쉽게 활용할 수 있다.

리스트 연산과 넘파이 어레이 연산의 속도 차이를 아래 코드가 보여준다. 아래 코드는 0부터 999,999까지의 숫자를 각각 두 배하는 연산에 필요한 시간을 측정한다. 결과적으로 넘파이 어레이를 이용한 연산이 50배 정도 빠르다.

주의사항: %time은 코드 실행시간을 측정하는 IPython의 기능이며, 파이썬 자체의 기능이 아니다.

아래 코드에서 my_array * 2my_array 어레이의 항목 각각을 두 배한 값을 항목으로 갖는다.

이제부터 넘파이에 대해 필수적으로 알아 두어야만 하는 내용들을 정리하며 살펴본다.

4.1 넘파이 다차원 어레이 객체(ndarray) (p. 135)

4.1.1 어레이 객체 생성 (p. 137)

리스트, 튜플 등을 np.array() 함수를 이용하여 어레이로 변환시킬 수 있다.

1차원 어레이

2차원 어레이

중첩된 리스트나 어레이는 2차원 어레이로 변환된다. 단, 항목으로 사용된 리스트의 길이가 모두 동일해야 한다. 즉, 2차원 어레이는 어레이의 모든 항목이 동일한 크기의 1차원 어레이이다.

shape 속성

어레이 객체의 shape 속성은 생성된 어레이의 모양을 저장한다. 행렬 모양의 어레이는 행과 열의 크기를 이용한 튜플로 보여준다. 위 어레이의 모양(shape)은 (2, 4)이다.

dtype 속성

어레이 객체의 dtype 속성은 어레이에 사용된 항목들의 자료형을 저장한다. 어레이의 모든 항목은 동일한 자료형을 가져야 한다. 넘파이는 파이썬 표준에서 제공하는 자료형보다 세분화된 자료형을 지원한다. 예를 들어, float64는 64비트로 구현된 부동소수점 자료형을 가리킨다. 앞으로 계속해서 세분화된 자료형을 만나게 될 것이다.

arr2 항목의 자료형은 int64, 즉, 64비트로 구현된 정수 자료형이다.

ndim 속성

차원은 ndim 속성에 저장되며, shape에 저정된 튜플의 길이와 동일하다.

1차원 어레이의 차원은 1이다.

1차원 어레이의 모양은 어레이의 길이 정보를 길이가 1인 튜플로 저장한다.

3차원 어레이

3차원 이상의 어레이는 처음에는 매우 생소하게 다가올 수 있다. 하지만 이미지 데이터 분석에서 가장 기본으로 사용되는 차원이기에 3차원 어레이에 익숙해져야 한다.

n x m x p 모양의 3차원 어레이를 이해하는 두 가지 방법은 다음과 같다.

<그림 출처: Big Data & Image Processing>

<그림 출처: NumPy Arrays and Data Analysis>

위 이미지를 직접 구현하면 다음과 같다.

어레이 객체 생성 함수

배열을 쉽게 생성할 수 있는 함수는 다음과 같으며, 각 함수의 기능은 numpy cheat sheet를 참고한다.

예제: zeros() 함수

0으로 이루어진 어레이를 생성한다. 1차원인 경우 정수를 인자로 사용한다.

2차원부터는 정수들의 튜플로 모양을 지정한다.

예제: empty() 함수

지정된 모양의 어레이를 생성한다. 항목은 초기화되지 않는다. 임의의 값이 보일 수 있지만 실제로는 어떤 항목도 임의로 지정된 게 아니다.다.

예제: arange() 함수

range() 함수와 유사하게 작동하며 부동소수점 스텝도 지원한다.

4.1.2 어레이 항목 자료형(dtype) (p. 139)

dtype은 어레이 항목의 자료형을 담고 있으며, 파이썬 표준 라이브러리에서 제공하는 int, float, str, bool 등을 보다 세분화시킨 자료형을 제공한다. 여기서는 세분화된 자료형을 일일이 설명하기 보다는 예제를 이용하여 세분화된 자료형의 형식을 살펴본다.

참고: 세분화는 주로 자료형의 객체가 사용하는 메모리 용량을 제한하는 형식으로 이루어진다. 이를 통해 보다 메모리 효율적이며 빠른 계산이 가능해졌다.

자료형 자료형 코드 설명
int8, uint8 i1, u1 signed/unsigned 8 비트 정수
int16, uint16 i2, u2 signed/unsigned 16 비트 정수
int32, uint32 i4, u5 signed/unsigned 32 비트 정수
int64, uint64 i8, u8 signed/unsigned 64 비트 정수
float16 f2 16비트(반 정밀도) 부동소수점
float32 f4 또는 f 32비트(단 정밀도) 부동소수점
float64 f8 또는 d 64비트(배 정밀도) 부동소수점
float128 f16 또는 g 64비트(배 정밀도) 부동소수점
bool ? 부울 값
object O 임의의 파이썬 객체
string_ S 고정 길이 아스키 문자열, 예) S8, S10
unicode_ U 고정 길이 유니코드 문자열, 예) U8, U10

float64 자료형

int32 자료형

astype() 메서드

astype() 메서드를 이용하여 dtype을 변경할 수 있다. 즉, 항목의 자료형을 강제로 변환시킨다.

주의사항: 문자열 자료형의 크기는 넘파이가 알아서 임의로 정하며, 부동소수점으로 형변환하면 지정된 정밀도에 따라 소수점 이하를 자른다.

앞서 부동소수점 정밀도를 4로 지정했기 때문에 어레이 항목은 모두 소수점 이하 네 자리까지만 보여준다.

np.set_printoptions(precision=4, suppress=True)

부동소수점 정밀도를 변경하면 그에 따라 다르게 결정된다.

astype() 메서드의 인자로 다른 배열의 dtype 정보를 이용할 수도 있다.

자료형 코드를 이용하여 dtype을 지정할 수 있다. (위 테이블 참조)

4.1.3 넘파이 어레이 연산 (p. 142)

넘파이 어레이 연산은 기본적으로 항목별로 이루어진다. 즉, 지정된 연산을 동일한 위치의 항목끼리 실행하여 새로운, 동일한 모양의 어레이를 생성한다.

덧셈

숫자와의 연산은 모든 항목에 동일한 값을 사용한다.

뺄셈

나눗셈

나눗셈 또한 항목별로 연산이 이루어진다. 따라서 0이 항목으로 포함되면 오류가 발생한다.

거듭제곱(지수승)

비교

사용 가능한 부울 연산은 아래 세 가지이다.