안녕하세요. 문범우입니다.
이번 포스팅에서는 python을 통해 데이터 분석을 할때 기초 라이브러리로 사용되는 Numpy에 대해서 알아보도록 하겠습니다.
해당 내용은 flearning의 김길호님의 강의를 바탕으로 작성되었습니다.
https://www.flearning.net/courses/6
1. Numpy란
Numpy는 C언어로 구현된 파이썬 라이브러리로써, 고성능의 수치계산을 위해 제작되었습니다. Numerical Python의 줄임말이기도 한 Numpy는 벡터 및 행렬 연산에 있어서 매우 편리한 기능을 제공합니다.
또한 이는 데이터분석을 할 때 사용되는 라이브러리인 pandas와 matplotlib의 기반으로 사용되기도 합니다.
numpy에서는 기본적으로 array라는 단위로 데이터를 관리하며 이에 대해 연산을 수행합니다. array는 말그대로 행렬이라는 개념으로 생각하시면 됩니다.
먼저 numpy를 사용하기 위해서는 아래와 같은 코드로 numpy를 import해야 합니다.
import numpy as np
사실상, numpy를 설치하고 단순히 import numpy 만 해도 되지만, 이를 코드에서 보다 편하게 사용하기 위해 as np 를 붙임으로써 np라는 이름으로 numpy를 사용합니다.
아래 실습에서는 jupyter notebook을 사용하였습니다.
Numpy 기초¶
1. Numpy 란?¶
# numpy 사용하기
import numpy as np
2. Array 정의 및 사용하기¶
data1 = [1,2,3,4,5]
data1
data2 = [1,2,3,3.5,4]
data2
# numpy를 이용하여 array 정의하기
# 1. 위에서 만든 python list를 이용
arr1 = np.array(data1)
arr1
# array의 형태(크기)를 확인할 수 있다.
arr1.shape
# 2. 바로 python list를 넣어 줌으로써 만들기
arr2 = np.array([1,2,3,4,5])
arr2
arr2.shape
# array의 자료형을 확인할 수 있다.
arr2.dtype
arr3 = np.array(data2)
arr3
arr3.shape
arr3.dtype
arr4 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
arr4
arr4.shape
numpy shape
numpy에서는 해당 array의 크기를 알 수 있다.
shape 을 확인함으로써 몇개의 데이터가 있는지, 몇 차원으로 존재하는지 등을 확인할 수 있다.
위에서 arr1.shape의 결과는 (5,) 으로써, 1차원의 데이터이며 총 5라는 크기를 갖고 있음을 알 수 있다.
arr4.shape의 결과는 (4,3) 으로써, 2차원의 데이터이며 4 * 3 크기를 갖고 있는 array 이다.
numpy 자료형
arr1이나 arr2는 int64라는 자료형을 갖는 것에 반해 arr3는 float64라는 자료형을 갖는다.
이는 arr3내부 데이터를 살펴보면 3.5라는 실수형 데이터를 갖기 때문임을 알 수 있다.
numpy에서 사용되는 자료형은 아래와 같다. (자료형 뒤에 붙는 숫자는 몇 비트 크기인지를 의미한다.)
- 부호가 있는 정수 int(8, 16, 32, 64)
- 부호가 없는 정수 uint(8 ,16, 32, 54)
- 실수 float(16, 32, 64, 128)
- 복소수 complex(64, 128, 256)
- 불리언 bool
- 문자열 string_
- 파이썬 오프젝트 object
- 유니코드 unicode_
2-1. np.zeros(), np.ones(), np.arange() 함수¶
numpy에서 array를 정의할 때 사용되는 함수들이다.
아래 실습을 통해 각각이 어떻게 다른지 살펴본다.
np.zeros(10)
np.zeros((3,5))
# np.zeros() 함수는 인자로 받는 크기만큼, 모든요소가 0인 array를 만든다.
np.ones(9)
np.ones((2,10))
# np.ones() 함수는 인자로 받는 크기만큼, 모든요소가 1인 array를 만든다.
np.arange(10)
np.arange(3,10)
# np.arange() 함수는 인자로 받는 값 만큼 1씩 증가하는 1차원 array를 만든다.
# 이때 하나의 인자만 입력하면 0 ~ 입력한 인자, 값 만큼의 크기를 가진다.
arr1 = np.array([[1,2,3],[4,5,6]])
arr1
arr1.shape
arr2 = np.array([[10,11,12],[13,14,15]])
arr2
arr2.shape
3-1. array 덧셈¶
arr1 + arr2
3-2. array 뺄셈¶
arr1 - arr2
arr1 * arr2
3-4. array 나눗셈¶
arr1 / arr2
3-5. array의 브로드 캐스트¶
위에서는 array가 같은 크기를 가져야 서로 연산이 가능하다고 했지만,
numpy에서는 브로드캐스트라는 기능을 제공한다.
브로드캐스트란, 서로 크기가 다른 array가 연산이 가능하게끔 하는 것이다.
arr1
arr1.shape
arr3 = np.array([10,11,12])
arr3
arr3.shape
arr1 + arr3
arr1 * arr3
위와 같이 서로 크기가 다른 arr1과 arr3의 연산이 가능하다.
연산결과를 살펴보면 arr3이 [10,11,12] 에서 [[10,11,12],[10,11,12]]로 확장되어 계산되었음을 확인할 수 있다.
동일한 방식으로 하나의 array에 스칼라 연산도 가능하다.
arr1 * 10
# 요소에 대해 제곱처리
arr1 ** 2
4. Array 인덱싱¶
numpy에서 사용되는 인덱싱은 기본적으로 python 인덱싱과 동일하다.
이때, python에서와 같이 1번째로 시작하는 것이 아니라 0번째로 시작하는 것에 주의한다.
arr1 = np.arange(10)
arr1
# 0번째 요소
arr1[0]
# 3번째 요소
arr1[3]
# 3번째 요소부터 8번째 요소
arr1[3:9]
arr1[:]
물론 1차원이 아닌 그 이상의 차원에서도 인덱싱이 가능하다.
arr2 = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
arr2
# 2차원의 array에서 인덱싱을 하기 위해선 2개의 인자를 입력해야 합니다.
arr2[0,0]
# 2행의 모든 요소 꺼내기
arr2[2,:]
# 2행의 3번째 요소 꺼내기
arr2[2,3]
# 모든 행의 3번째 요소 꺼내기
arr2[:,3]
5. Array boolean 인덱싱(마스크)¶
위에서 이용한 다차원의 인덱싱을 응용하여 boolean 인덱싱을 할 수 있다.
해당 기능은 주로 마스크라고 이야기하는데, boolean인덱싱을 통해 만들어낸 array를 통해
우리가 원하는 행 또는 열의 값만 뽑아낼 수 있다.
즉, 마스크처럼 우리가 가리고 싶은 부분은 가리고, 원하는 요소만 꺼낼 수 있다.
names = np.array(['Beomwoo','Beomwoo','Kim','Joan','Lee','Beomwoo','Park','Beomwoo'])
names
names.shape
# 아래에서 사용되는 np.random.randn() 함수는 기대값이 0이고, 표준편차가 1인 가우시안 정규 분포를 따르는 난수를 발생시키는 함수이다.
# 이 외에도 0~1의 난수를 발생시키는 np.random.rand() 함수도 존재한다.
data = np.random.randn(8,4)
data
data.shape
위와 같은 names와 data라는 array가 있다.
이때, names의 각 요소가 data의 각 행과 연결된다고 가정해보자.
그리고 이 때, names가 Beomwoo인 행의 data만 보고 싶을 때 다음과 같이 마스크를 사용한다.
# 요소가 Beomwoo인 항목에 대한 mask 생성
names_Beomwoo_mask = (names == 'Beomwoo')
names_Beomwoo_mask
data[names_Beomwoo_mask,:]
위의 결과를 보면, 요소가 Beomwoo인 것은 0번째, 1번째, 5번째, 7번째 이므로
data에서 0,1,5,7행의 모든 요소를 꺼내와야 한다.
이를 위해 요소가 Beomwoo인 것에 대한 boolean 값을 가지는 mask를 만들었고
마스크를 인덱싱에 응용하여 data의 0,1,5,7행을 꺼냈다.
# 요소가 Kim인 행의 데이터만 꺼내기
data[names == 'Kim',:]
# 논리 연산을 응용하여, 요소가 Kim 또는 Park인 행의 데이터만 꺼내기
data[(names == 'Kim') | (names == 'Park'),:]
물론 data array 자체적으로도 마스크를 만들고, 이를 응용하여 인덱싱이 가능하다.
data array에서 0번째 열의 값이 0보다 작은 행을 구해보자.
# 먼저 마스크를 만든다.
# data array에서 0번째 열이 0보다 작은 요소의 boolean 값은 다음과 같다.
data[:,0] < 0
# 위에서 만든 마스크를 이용하여 0번째 열의 값이 0보다 작은 행을 구한다.
data[data[:,0]<0,:]
이를 통해 특정 위치에만 우리가 원하는 값을 대입할 수 있다.
위에서 얻은, 0번째 열의 값이 0보다 작은 행의 2,3번째 열값에 0을 대입해보자.
# 0번째 열의 값이 0보다 작은 행의 2,3번째 열 값
data[data[:,0]<0,2:4]
data[data[:,0]<0,2:4] = 0
data
arr1 = np.random.randn(5,3)
arr1
# 각 성분의 절대값 계산하기
np.abs(arr1)
# 각 성분의 제곱근 계산하기 ( == array ** 0.5)
np.sqrt(arr1)
# 각 성분의 제곱 계산하기
np.square(arr1)
# 각 성분을 무리수 e의 지수로 삼은 값을 계산하기
np.exp(arr1)
# 각 성분을 자연로그, 상용로그, 밑이 2인 로그를 씌운 값을 계산하기
np.log(arr1)
np.log10(arr1)
np.log2(arr1)
# 각 성분의 부호 계산하기(+인 경우 1, -인 경우 -1, 0인 경우 0)
np.sign(arr1)
# 각 성분의 소수 첫 번째 자리에서 올림한 값을 계산하기
np.ceil(arr1)
# 각 성분의 소수 첫 번째 자리에서 내림한 값을 계산하기
np.floor(arr1)
# 각 성분이 NaN인 경우 True를, 아닌 경우 False를 반환하기
np.isnan(arr1)
np.isnan(np.log(arr1))
# 각 성분이 무한대인 경우 True를, 아닌 경우 False를 반환하기
np.isinf(arr1)
# 각 성분에 대해 삼각함수 값을 계산하기(cos, cosh, sin, sinh, tan, tanh)
np.cos(arr1)
np.tanh(arr1)
6-2. 두 개의 array에 적용되는 함수¶
arr1
arr2 = np.random.randn(5,3)
arr2
# 두 개의 array에 대해 동일한 위치의 성분끼리 연산 값을 계산하기(add, subtract, multiply, divide)
np.multiply(arr1,arr2)
# 두 개의 array에 대해 동일한 위치의 성분끼리 비교하여 최대값 또는 최소값 계산하기(maximum, minimum)
np.maximum(arr1,arr2)
arr1
# 전체 성분의 합을 계산
np.sum(arr1)
# 열 간의 합을 계산
np.sum(arr1, axis=1)
# 행 간의 합을 계산
np.sum(arr1, axis=0)
# 전체 성분의 평균을 계산
np.mean(arr1)
# 행 간의 평균을 계산
np.mean(arr1, axis=0)
# 전체 성분의 표준편차, 분산, 최소값, 최대값 계산(std, var, min, max)
np.std(arr1)
np.min(arr1, axis=1)
# 전체 성분의 최소값, 최대값이 위치한 인덱스를 반환(argmin, argmax)
np.argmin(arr1)
np.argmax(arr1,axis=0)
# 맨 처음 성분부터 각 성분까지의 누적합 또는 누적곱을 계산(cumsum, cumprod)
np.cumsum(arr1)
np.cumsum(arr1,axis=1)
np.cumprod(arr1)
6-4. 기타 함수¶
arr1
# 전체 성분에 대해서 오름차순으로 정렬
np.sort(arr1)
# 전체 성분에 대해서 내림차순으로 정렬
np.sort(arr1)[::-1]
# 행 방향으로 오름차순으로 정렬
np.sort(arr1,axis=0)
'AI & BigData > 데이터분석 관련' 카테고리의 다른 글
나이브 베이즈 분류(Naive Bayesian Classification) 란? (1) | 2018.07.07 |
---|---|
Matplotlib 기초 정리 (3) | 2018.06.11 |
pandas(판다스) 기초 정리 (13) | 2018.06.08 |