많은 숫자 데이터를 하나의 변수에 넣고 관리 할 때 리스트는 속도가 느리고 메모리를 많이 차지하는 단점이 있다. 배열(array)을 사용하면 적은 메모리로 많은 데이터를 빠르게 처리할 수 있다. 배열은 리스트와 비슷하지만 다음과 같은 점에서 다르다.
1. 모든 원소가 같은 자료형이어야 한다.
2. 원소의 갯수를 바꿀 수 없다.
파이썬은 자체적으로 배열 자료형을 제공하지 않는다. 따라서 배열을 구현한 다른 패키지를 임포트해야 한다. 파이썬에서 배열을 사용하기 위한 표준 패키지는 넘파이(NumPy)다.
# a = np.array([1, 2, 3])
#배열의 차원과 크기
print(a.ndim)
print(a.shape)
1
(3,)
넘파이의 배열 즉, ndarray클래스는 원소가 모두 같은 자료형이어야 한다. array 명령으로 배열을 만들 때 자료형을 명시적으로 적용하려면 dtype 인수를 사용한다. 만약 dtype 인수가 없으면 주어진 데이터를 저장할 수 있는 자료형을 스스로 유추한다. 만들어진 배열의 자료형을 알아내려면 dtype 속성을 보면 된다.
x = np.array([1, 2, 3])
x.dtype
dtype('int64')
x = np.array([1.0, 2.0, 3.0])
x.dtype
dtype('float64')
사용하는 원소의 갯수가 정해저 있기 때문에 reshape 명령의 형태 튜플의 원소 중 하나는 -1이라는 숫자로 대체할 수 있다. -1을 넣으면 해당 숫자는 다를 값에서 계산되어 사용된다.
a.reshape(3, -1)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
x.argmin() # 최솟값의 위치
x.argmax() # 최댓값의 위치
a.sort(axis=1)
a
array([[ 3, 4, 5, 7],
[ 1, 9, 11, 12],
[ 1, 2, 14, 15]])
만약 자료를 정렬하는 것이 아니라 순서만 알고 싶다면 argsort 명령을 사용한다.
a = np.array([42, 38, 12, 25])
j = np.argsort(a)
j
array([2, 3, 1, 0])
표본 분산(sample variance)은 데이터와 표본 평균간의 거리의 제곱의 평균이다
표본 분산이 작으면 데이터가 모여있는 것이고 크면 흩어져 있는 것이다.
np.var(x) # 분산
표본 표준편차(sample standard variance)는 표본 분산의 양의 제곱근 값이다.
np.std(x) # 표준 편차
np.unique([11, 11, 2, 2, 34, 34])
array([ 2, 11, 34])
그러나 unique 함수는 데이터에 존재하는 값에 대해서만 갯수를 세므로 데이터 값이 나올 수 있음에도 불구하고 데이터가 하나도 없는 경우에는 정보를 주지 않는다.
따라서 데이터가 주사위를 던졌을 때 나오는 수처럼 특정 범위안의 수인 경우에는 bincount 함수에 minlength 인수를 설정하여 쓰는 것이 더 편리하다. bincount 함수는 0 부터 minlength - 1 까지의 숫자에 대해 각각 카운트를 한다. 데이터가 없을 경우에는 카운트 값이 0이 된다.
np.bincount([1, 1, 2, 2, 2, 3], minlength=6)
array([0, 2, 3, 1, 0, 0])