넘파이(Numpy)는 C로 구현된 고성능의 수치계산을 위해 제작된 파이썬 라이브러리로, 'Numerical Python'의 줄임말입니다. 넘파이는 벡터, 행렬 연산에 있어 많은 기능들을 제공하고 pandas와 matplotlib의 기반으로 사용되기 때문에 데이터분석, 머신러닝에 기초적인 라이브러리 입니다.
머신러닝 프로그래밍을 할 때,
양질의 데이터를 어떻게 얻을 것인가, 얻은 데이터를 어떻게 전처리 해야하는가에 대한 고민을 많이 하게되는데요.
후자의 문제는 넘파이에 익숙해지면 편해질 것이라 생각되어 Numpy공부를 제대로 해보기로 결정했습니다! 넘파이에 익숙해지면 데이터의 전처리가 훨씬 빨라지고 ML 모델을 구현할 때도 더 좋은 성능을 내는 모델을 구현할 수 있을 것이라 생각했기 때문입니다. !!@
Numpy 특징
파이썬 프로그래밍 언어를 위한 라이브러리이다.
대규모의 다차원 배열과 행렬을 지원, 그리고 이러한 배열에서 작동 할 수 있는 많은 수학 함수를 지원한다.
기본적으로 array단위로 데이터를 관리하고 연산을 수행하므로 파이썬 데이터 타입에 비해 빠르고 메모리에 효율적이다.
Numpy의 기본단위가 되는 array는 Dynamic type을 지원하지 않는다. 한 array에 한 타입만 저장 가능
1차원의 Numpy array : Vector
2차원의 Numpy array : Matrix
3차원이상의 Numpy array : Tensor 이며, Numpy는 이 텐서를 쉽게 표현할 수 있다.
- Numpy 기초 : Numpy Array 다루기
.shape
numpy에서는 array의 크기를 .shape을 사용하여 알 수 있습니다. 예제의 arr변수에 할당된 행렬의 쉐입은 (4, )로 1차원의 데이터이며 크기가 4라는 것을 의미합니다.(열4개)
arr2.dtype을 찍어보면 어떻게 될까요?
(4,3)이라는 결과가 출력될 것입니다. 2차원의 데이터이며 크기가 4*3행렬임을 나타냅니다. 만약, 이 행렬이 자료였다면 3 컬럼(열)을 가지고 있는 데이터가 4개(행)라는 뜻이 될 것입니다.
.dtype
arr의 데이터 타입은 int64이며 부호가 있는 정수(integer)이며 64비트를 가지고 있는 데이터타입이라는 것을 의미합니다. 만약 arr의 요소 중 실수가 섞여 있었다면 float64가 되었을 것입니다.
numpy의 자료형 종류
부호가 있는 정수 int(8, 16, 32, 64)
부호가 없는 정수 uint(8, 16, 32, 64)
실수 float(8, 16, 32, 64)
복소수 complex(8, 16, 32, 64)
불리언 bool
문자열 string_
파이썬 오브젝트 object
유니코드 unicode_
np.zeros()는 자연어 전처리에서 단어사전에 없는 데이터를 모두 0으로 초기화 할때 사용했던 것 같습니다. np.zeros()를 이용하면 없는 데이터를 0으로 바꿔주는 부분을 빠르게 진행할 수 있습니다.
※ 추가
np.full() 원하는 숫자를 채워 배열 생성, np.empty() 특정값을 지정하지 않고 배열생성
np.full((2,3), 10, dtype=np.int32)
결과 >> array([[10,10,10], [10,10,10]])
np.empty((2,2), dtype=int)
결과 >> array([[257 83886080], [18 0]])
np.empty()로 생성되는 배열의 요소는 난수와 다른 임의의 값이 들어가며 값은 메모리에 저장된 내용에 따라 달라집니다. 메모리에 남아있는 값이 empty차원 크기 안에 있다면 np.empty로 새롭게 불러와도 그대로 있게 됩니다. 이는 numpy의 array가 메모리 영역을 직접 사용하기 때문입니다.
따라서 np.empty()로 배열을 생성할 경우, 좀 더 빠른 속도로 배열을 생성할 수 있습니다.
np.zeros_like()나 np.empty_like()처럼 뒤에 like가 붙은 함수는 기존 배열의 차원만 가져와서 ones나 zeros 행렬을 만들 수 있습니다.
또 대각의 값이 1인 배열(단위행렬)을 생성하는 함수도 있습니다.
np.identity(N, dtype=자료형) : N*N 크기의 단위 행렬을 반환
np.eye(N, M, k=K, dtype=자료형) : N*M 크기의 K값 만큼 이격된 단위 행렬을 반환(K가 양수 이면 우상 방향으로, 음수이면 좌하 방향으로 이동)
파이썬은 인덱스가 1부터 시작하고, 넘파이는 0부터 시작한다는 사실.... 이런 작은 요소들이 자칫하면 큰 실수를 낳을 수 있는데요. 한번은 Keras의 Tokenizer를 이용해서 단어->idx로 매핑되는 단어사전을 만들고, 그 단어사전 enumerate()를 이용해 idx->단어 사전을 만들었는데 앞의 사전은 인덱스가 1로 시작하지만, 뒤의 사전은 0부터 시작해서 전혀 다른 결과가 나온 적이 있습니다.
Numpy를 사용하는 아주 기초적인 방법들에 대해 살펴보았습니다. 다음편부터는 머신러닝의 전처리를 유용하게 해주는 Numpy 내장 함수들에 대해 살펴보겠습니다.