Upstage AI Lab 2기
2023년 12월 27일 (수) Day_012
Day_012 실시간 강의 (오전) :
(패스트캠퍼스 김용담 강사님)
Intro) Why NumPy?
numerical computing for Python
수많은 라이브러리들의 기초가 됨. eg. SciPy, scikit-learn, TensorFlow, PyTorch 등
python은 실수연산에 약함
AI 에서는 float 연산을 많이 하기 때문에 python만으로 연산시 numerical error가 굉장히 많이 뜸.
∴ Python에서 실수 연산을 할 수 있도록 C++로 만들어준 라이브러리
note. padas 1.x vs 2.x
padas 1.x - numpy based
padas 2.x - Apache Arrow based
장점 : Apache Arrow => 대용량 처리 빠름
단점 : np 연산 전적으로 지원 X
이 수업에서는 pandas == 1.5.3 사용
수업 목표 :
1. numpy array
2. numpy 연산 (broadcasting / methods)
3. numpy 연산의 활용
1. numpy array
1차원 list -> 2차원 matrix -> 3차원 tensor
# 파이썬 2차원 리스트(행렬) 선언
data2 = [[1,2], [3,4]]
# [[1, 2], [3, 4]]
# 2차원 리스트를 np.array로 변환
arr2 = np.array(data2)
# array([[1, 2],
# [3, 4]])
# note : array임을 명시함
numpy.array vs python list
np.array의 특징 1) 생성 후 크기 변경 불가 2) 무조건!! 모든 원소의 dtype 동일 |
python list 1) 원소 추가 삭제가 쉬움 2) 다른 dtype을 원소로 가질 수 있음. str, float, list 등. |
np.array 크기 변경 불가, dtype 동일 => 사용할 연산자와 연산횟수가 정해짐
왜 이것이 이점이 되는가?
python 은 dynamic type binding => 무조건 dtype을 매번 비교
사용할 수 있는 연산 크기가 결정 되면 메모리 접근 효율성이 높아지고 연산 속도가 빨라짐
2. numpy 연산
1) broadcasting (= array arithmetic, universal function)
서로 크기가 다른 numpy array를 연산할 때, 자동으로 연산을 전파(broadcast) - > elementwise 연산 가능
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
v1 + v2 # array([5, 7, 9])
v1 - v2 # array([-3, -3, -3])
v1 * v2 # array([ 4, 10, 18])
v1 / v2 # array([0.25, 0.4 , 0.5 ])
# dot product
v1 @ v2 # 32
arr1 = np.array([[1,2,3], [4,5,6]])
arr1.shape
# (2, 3)
arr2 = np.array([-1, -1, -1])
arr2.shape
# (3,)
arr1 + arr2
# array([[0, 1, 2],
# [3, 4, 5]])
arr1 * arr2
# array([[-1, -2, -3],
# [-4, -5, -6]])
Universal Function : broadcast 기능 확장, numpy array의 모든 원소에 동일한 함수를 반복문으로 적용한 것과 같은 효과
x = np.array([1, 2, 3])
# f = lambda x : 1/x
1/x
# f = lambda x : x + 2
x + 2
# f = lambda x : x**2
x**2
for 문을 이용하는 것 보다 broadcasting이 빠름.
note - array shape
arr.shape
(행 / 열 개념과 조금 다름)
shape (3,) 와 (3, 1) 은 다르다.
(3,) => vector
(3, 1) => matrix
arr1 = np.array([1,2,3])
arr1.shape
# (3,)
arr1 = np.array([[1],[2],[3]])
arr1.shape
# (3, 1)
quiz. 32x32 크기의 color image 100장이 있다면?
shape (100, 3, 32, 32) (batch size, channel, height, width)
Q 브로드캐스팅으로 (3,2,3) 와 (2,1) 연산되나요?
한주형님 답변
넘파이 브로드캐스팅 규칙에 의하면, 브로드캐스팅 연산은 서로 셰잎이 다르면 오른쪽으로 정렬해서 계산한다고 보면 됩니다. (3,2,3)과 (2,1)은 오른쪽 정렬하면 2가 같고, 1은 3으로 브로드캐스팅 되서 연산됩니다. 1의 경우는 broadcasting에서 1이 아닌 다른 셰잎들이 모양이 맞지 않는게 아니면 알아서 해당 연산에 대응하는 1이 아닌 셰잎으로 브로드캐스팅 됩니다
이걸로 실험해보세요
a = np.arange(18).reshape(3,2,3) # a.shape (3, 2, 3)
b = np.arange(2).reshape(2,1) # b.shape (2, 1)
print(a+b) # (a+b).shape (3, 2, 3)
[ [ [ ] ] ] 의 shape (a, b, c)
a = [ ] 안의 원소의 갯수
b = [ ] 안의 원소의 갯수
c = [ ] 안의 원소의 갯수
2) NumPy Methods
np.random.randn()
np.abs()
np.square()
np.sqrt()
np.linalg.norm()
np.linalg.eig()
Aggregation functions
# row(axis = 1), column(axis = 0) 단위로도 연산 가능
np.sum()
np.mean()
np.std()
np.min()
np.max()
np.argmin()
np.argmax()
* arg = argument
# axis 설정에 따른 연산 차이
np.sum(mat2)
np.sum(mat2, axis=0)
np.sum(mat2, axis=1)
추가) 수식 구현
# euclidean distance
def euclidean_distance(x, y) :
# x, y : np.array (n-dim vector)
return np.sqrt(np.sum(np.square(x - y)))
# cosine distance
# = 1 - cosine similarity
# https://en.wikipedia.org/wiki/Cosine_similarity
def euclidean_distance(x, y) :
n1 = np.linalg.norm(x)
n2 = np.linalg.norm(y)
cosine_sim = (x @ y)/(n1*n2)
return (1 - cosine_sim)
tip : Data Science 4종 libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
ref
https://github.com/pybind/pybind11
'Upstage AI Lab 2기' 카테고리의 다른 글
Upstage AI Lab 2기 [Day014] (1) Seaborn_기초 (0) | 2023.12.29 |
---|---|
Upstage AI Lab 2기 [Day012] (2) pandas_기초_1 (0) | 2023.12.28 |
Upstage AI Lab 2기 [Day010] (1) Flask 기초 (0) | 2023.12.26 |
Upstage AI Lab 2기 [Day008] (2) 실습 (0) | 2023.12.22 |
Upstage AI Lab 2기 [Day008] Python project(day2) (작성) (0) | 2023.12.20 |