본문 바로가기

Upstage AI Lab 2기

Upstage AI Lab 2기 [Day012] (1) numpy_기초

Upstage AI Lab 2기

2023년 12월 27일 (수) Day_012

 

Day_012 실시간 강의 (오전) :

(패스트캠퍼스 김용담 강사님)

 

Intro)  Why NumPy?

더보기

https://numpy.org/

numerical computing for Python

수많은 라이브러리들의 기초가 됨. eg. SciPy, scikit-learn, TensorFlow, PyTorch 등

python은 실수연산에 약함

AI 에서는 float 연산을 많이 하기 때문에 python만으로 연산시 numerical error가 굉장히 많이 뜸.

∴ Python에서 실수 연산을 할 수 있도록 C++로 만들어준 라이브러리

https://numpy.org/

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