Search
🔺

5. 파이썬 라이브러리 Numpy

CHAPTER 4-1. Numpy

1. Numpy란

numpy: numerical python
numerical computing: 컴퓨터가 실수값을 효과적으로 계산할 수 있도록 하는 연구 분야
vector arithmetic: 벡터 연산 → 데이터가 벡터로 표현되기 때문
numpy array >> python list(or tuple) 성능이 더 뛰어남
python list와 비슷한 개념을 numpy에서는 numpy array라고 부름
→ 파이썬 리스트처럼 여러 데이터를 한번에 다룰 수 있으나, 모든 데이터가 동일한 data type을 가져야합니다.
numpy array는 만들어지고 나면 원소의 update는 가능하지만, array의 크기를 변경할 수는 없음
→ append라는 함수가 있으나, 의미가 다름

2. 데이터 분석을 위한 선형대수학

구분
scalar: 한개의 숫자
vector: 리스트와 같은 유형 → 크기방향이 있음
문자의 경우도 왼쪽에서 오른쪽으로 읽는 특성이 있기 때문에 vector 데이터라고 함
Matrix: 행렬데이터 (e.g 엑셀)
Tensor: 메트릭스에서 축이 하나 늘어나게 되면 3차원이 됨 (e.g. 이미지, 동영상)
데이터분석에 자주 사용하는 특수한 연산 → 벡터와 벡터의 내적
내적이 이루어지려면
벡터가 마주하는 shape의 갯수(길이)가 같아야 합니다.
e.g (1,4)와 (4,1)→ (1,1) / (3,5)와 (5,4) → (3,4)
연산 앞에 위치한 벡터는 전치(transpose) 되어야 합니다.

CHAPTER 4-2~3. Array

1. Array 만들어보기

불러오기: import numpy as np
파이썬 리스트 선언
1차원: data = [1, 2, 3, 4, 5]
2차원
numpy array를 만들기 → 파이썬 list를 numpy로 변환하는 것
생성하기: arr2= np.array(data) → arr2 = np.array([1,2,3,4,5]) 동일
크기확인 :arr2.shape = (3,3) → 3 x 3 이라는 뜻
차원확인 : arr2.ndim = 2 → 2차원이라는 뜻
크기 : arr2.size = 9 → 말그대로 곱하기임
타입확인 : arr2.dtype = int 64 → 원소의 타입 integer + 64 bits
공간: arr2.itemsize = 8 → 바이트

2. Array Initialization

공간을 만들어주는 작업
원소가 0인 array를 생성하는 np.zeros()
np_zeros의 디폴트갑 : float64
0이 5개 있는 array
0이 3x3인 array
튜플로 넘겨줘야함
원소가 1인 array를 생성하는 np.ones()
1인 3개 있는 array
1이 2x2인 array
특정 범위의 원소를 가지는 np.arange()
→ range의 경우에는 그 자체로는 그냥 범위인데
arange는 바로 일렬로 만들어줌

3. Array Operation

numpy array를 쓰는 가장 큰 이유는 vector처럼 사용할 수 있기 때문
e.g. arr1 = np.array([1, 2, 3, 4, 5]) --> (1, 2, 3, 4, 5) # vector
그렇기 때문에 scipy, matplotlib, scikit-learn, pandas, tensorflow, pytorch 등 대부분의 데이터분석 라이브러리들이 numpy array를 사용
vector와 tuple 비교
→ vector는 원소끼리의 수가 동일해야 함
tuple addition
vector addition
vector @ → 각각의 위치에있는 원소를 곱해서 더한것
v1 @ v2 = 32
1x4 + 2x5 + 3x6

4. Broadcast

서로 크기가 다른 numpy array를 연산할 때, 자동으로 연산을 전파(broadcast)해주는 기능
예제
더하기와 곱하기

5. Universal Functions

numpy array는 하나의 함수를 모든 원소에 자동으로 적용해줌
int → float 변경하기
arr1 = np.array([1,2,3] , dtype = float)
arr1 / 1 → 나누기를 할 때 자동적으로 float으로 바꾸기 떄문에
모든 원소를 역수를 취하기
1/arr1
arr1 = np.array([1,2,3])
모든 원소에 2를 더할 때
arr1 + 2
array 연산
행렬 내적
test_array @ test_array.T 값: 30
내적은 어떨때 사용하나?
예: 쇼핑을 할 때 각 물건의 가격은 데이터 벡터, 각 물건의 수량은 가중치로 생각하여 내적을 구하면 총금액을 계산할 수 있습니다.
예제
포트폴리오
# 각 종목의 가격은 80,000원, 270,000원, 160,000원이다. # 삼성전자 100주, 셀트리온 30주, 카카오 50주로 구성하기 위한 매수금액을 구하시오 # (80000 * 100) + (270000 * 30) + (160000 * 50) price = np.array([80000, 270000,160000]) stock = np.array([100, 30, 50]) price @ stock 2410000
Python
복사
취향 비교
v1과의 내적 구하기: v1 @ v2 = 1 , v1 @ v 3 = 2 ...
→ 내적의 크기가 클 수록 v1과 취향이 겹침
→ v3, v5, v6가 본것들 중 그 사이에서 내적이 큰 것들을 v1에게 추천
도깨비와 지옥을 추천해주는데 도깨비가 취향이 더 클 확률이 큼
v2과의 내적 구하기: v2 @ v1 = 1 ... v2 @ v6 = 2
→ v6과의 내적이 가장 크기때문에 v6이 본것중 v2가 안본것들을 추천
오징어게임과 도깨비를 추천

CHAPTER 4-4. Array Indexing

1. Indexing

1차원 일 때
arr1 생성 arr1 = np.aragne(10)
인덱싱 arr1 [ 0 ]
슬라이싱 arr1[:3]
array([0,1,2])
2차원 일 때
arr2의 2, 3 원소 → 7 arr2[1][2] = arr2[1,2]
리스트와는 다르게 인덱싱 안에는 숫자들을 넣을 수 있음
arr2의 세번째 컬럼 (3,7,11) arr2[:, 2]
→ arr2에 있는 모든 row에 대해서 세번 째 원소를 indexing
arr2(0,2)
arr2(1,2)
arr2(2,2)
arr2에 있는 모든 원소에 대해 세번째 인덱스를 쓰겠다
arr2의 두번째 row arr2[1] = arr2[1, :]
→ arr2에 있는 두번째 row에 대해서 모든 원소를 indexing

2. Masking

기본 array에 마스크 만들기
numpy인 mask가 1인 원소들
mask에서 1인 원소일 때만 true가 나옴
랭덤으로 생성한 data에 mask적용
masked_data에서 true가 나온 row만 추출 → 1, 4, 5
위의 절차를 생략하고, data[mask == 1, :] 로 바로 생성 가능 → fancy indexing
fancy indexing
data[ : , 0] < 0 → 첫 번째 column의 값들 중 0보다 작은 것
data [data[ : , 0] < 0, 0 ] data에서 0 보다 작은 column이 있는 행에서 첫 번째 원소
data [data[ : , 0] < 0, 0 ] = 0
data에서 0 보다 작은 column이 있는 행에서 첫 번째 원소를 0으로 치환
data[data < 0] = 0 모든 데이터를 대상으로 했을 때 0보다 작은 것들을 0으로 치환

CHAPTER 4-5. Array Functions

1. Numpy Methods 유용한 넘파이 함수들

np.random.randn(5,3) → random sampling을 한 원소를 가지는 5x3행렬을 만든다
np.abs(mat1) → 절대값 씌우기
np.square(mat1) → 제곱
np.sign(mat1) → 부호
np.floor(mat1) → 내림

2. Reshaping Array

reshape(x,y)행렬의 shape을 변경하기

3. concatenation or arrays

arr1 + arr2 를 하는 경우 → 각 벡터를 더함
np.concatenate([arr1, arr2]) → 두개의 벡터를 합치는 것
arr1, arr2를 리스트로 만들어서 합치는 것
np.vstack([arr1, arr2]) → vertically 쌓는 것
np.hstack([arr1, arr2]) → horizantally 쌓는 것

CHAPTER 4-6. Aggregation Functions

각종 연산 함수(링크)
np.sum(mat1) → 모든 원소를 다 더한 값
np.sum(mat1, axis = 0) 컬럼별 총합
np.sum(mat1, axis = 1) 로우별 총합
np.sort(mat3, axis = 0) 정렬
np.argmin(mat3, axis =0) 최소값이 있는 인덱스