넘파이 (NumPy)
넘파이(공식 홈페이지)는 파이썬에서 수치 계산을 도와주는 라이브러리로 파이썬에서 기본적으로 사용되는 리스트와 달리 모든 원소가 같은 자료형이고 크기를 바꿀 수 없는 배열을 활용할 수 있게 해준다.
넘파이의 다차원 배열 객체를 통해 벡터, 행렬, 텐서 등을 효율적으로 계산하도록 하며, 덕분에 여러 수학, 통계, 데이터 분석, 기계 학습 등 다양한 라이브러리와 연동된다.
내부 코드가 C로 구현되어 있어 파이썬 자체 계산보다 더욱 빠른 연산을 보여준다.
import numpy as np
넘파이는 기본적으로 np
로 바꿔 불러오는 것이 관례이다.
넘파이 배열 (ndarray)
넘파이의 array
함수에 리스트를 넣으면 ndarray
클래스의 객체로 변환하여 사용할 수 있다. 앞서 언급했듯이 단일 자료형을 사용해야 하기 때문에 정수와 실수가 섞여 있으면 실수형으로 모두 변환되고, 문자열이 섞여 있으면 문자열로 모두 변환된다.
아래와 같이 임의의 리스트를 넘파이 배열로 바꿀 수 있다.
numpy_array = np.array([1, 2, 3, 4])
type
함수를 통해서 넘파이 배열인지 확인 가능하고, dtype
을 이용하여 내부 자료형을 확인할 수 있다.
type(numpy_array) # 자료형 확인
numpy_array.dtype # 내부 자료형 확인
위 코드를 프린트해보면 결과는 아래와 같다.
numpy.ndarray
dtype('int64')
여기서 int64
는 64 bit를 사용하는 정수 자료형을 말한다. int8
int16
int32
자료형도 있으나 기본적으로 int64
로 설정된다. 만약 작은 값만 사용한다면, int64
를 더 작은 자료형으로 바꿔 메모리를 효율적으로 사용할 수 있겠다.
기본적으로 위와 같이 리스트를 넣어 1차원 배열을 만들 수 있고, 2차원 리스트를 넣어 2차원 배열, 즉 행렬(matrix)을 만들 수도 있다. 3차원 이상의 리스트를 넣어 3차원 이상의 배열, 즉 텐서(tensor)를 만들 수도 있다.
또 zeros
를 이용하여 내부 값으로 0을 가지는 배열을 만들 수도 있다. 이때 dtype 매개변수(parameter)를 이용하여 내부 자료형을 설정할 수도 있다.
numpy_array = np.zeros(10, dtype='int64')
# array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] )
2차원 배열도 가능하다.
numpy_array = np.zeros((2, 3))
# array([[0., 0., 0.], [0., 0., 0.]])
기본 dtype
이 float64
로 되어 있기에 내부 자료형에 소수점이 확인된다.
0이 아니라 1로 채우고 싶다면 ones
를 이용하면 된다. zeros
를 ones
로 대채하면 동일하게 동작한다.
range
함수처럼 arange
(참고 링크)를 이용하여 범위를 지정하여 만들 수도 있고, linspace
(참고링크)를 이용하여 범위를 나누어서 만들 수도 있다.
np.arange(stop)
np.arange(start, stop)
np.arange(start, stop, step)
np.arange(start, stop, step, dtype=None)
np.linsapce(start, stop, num)
활용
이러한 방식으로 만들어진 배열들은 ndim
을 이용하여 차원을 알아내고, shape
을 이용하여 크기를 알아낼 수 있다.
numpy_array.ndim
numpy_array.shape
만약 1차원 배열을 2차원으로 만들고 싶다면 차원을 바꿔주는 reshpae
(참고 링크)을 이용할 수 있다.
numpy_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
numpy_array.reshape(2, 5) # 행, 열
# numpy_array.reshape(2, -1) -1은 자동으로 행에 맞춰 열을 바꾸는 것
# numpy_array -> array([1, 2, 3, 4, 5], [6, 7, 8, 9, 0])
또 T
를 이용하여 전치행렬을 만들 수도 있다. 즉 열과 행을 바꿀 수도 있다.
numpy_array_2 = numpy_array.T
배열을 연결할 수도 있다. 같은 수의 행을 가진 배열을 연결할 때는 hstack
(참고 링크)을 이용하고, 같은 수의 열을 가진 배열을 연결할 때는 vstack
(참고 링크)을 이용한다.
a = np.array( [ [ 1, 2 ] ,
[ 4, 5 ] ] )
b = np.array( [ [ 0, 0, 0 ] ,
[ 0, 0, 0 ] ] )
np.hstack( [ a, b ] )
a = np.array( [ [ 1, 2, 3, 4 ] ] )
b = np.array( [ [ 0, 0, 0, 0 ] ,
[ 0, 0, 0, 0 ] ] )
np.vstack( [ a, b ] )