본문 바로가기

대외활동/ABC 지역주도형 청년 취업역량강화 ESG 지원산업

[220823 ABC - 6일차] PYTHON 라이브러리

반응형

 [ 수학 라이브러리 numpy ]

- 많은 게임 프로그램과 시뮬레이션에서 무작위 번호, 즉, 난수를 구하는 것이 필수적이다.

- 난수나 수학과 관련된 집합, 특정 계산과 숫자를 2차원, 1차원 형태로 관리해주는 모듈이다.

- 인공지능에서 필수적으로 사용되는 기능이다.

- numpy는 numeraical python의 약자로, 파이썬에서 배열을 처리할 때 널리 사용되는 라이브러리다.

- numpy는 배열 자료구조를 이용한다.

- 즉, 배열이라는 개념은 파이썬에서 존재하지 않기 때문에 numpy를 설치해서 사용한다.

- 처리속도가 빠르다. 대용량의 다차원 배열에서 파이썬의 리스트보다 월등히 빠르다.

- 유연한 연산을 제공한다.

!pip install numpy
import numpy as np

# 1차원 배열구조
a = np.array([1,2,3])
print(a)

# 2차원 배열구조
b = np.array([[1,2,3], [4,5,6], [7,8,9]])
print(b)

# 2차원 배열이 아닌 객체(리스트 구조)로 이루어진 1차원 배열
c = np.array([list[1,2,3], list([10,20,300,4])], dtype=object)
print()
print(c)

# 1 ~ 10000까지 데이터로 구성된 배열을 생성
d = np.arange(1,10001)
print(d)

- numpy 의 데이터 형식 

numpy 의 데이터 형식

- numpy 자주 사용하는 함수 : linspace함수

- linspace 함수는 arange함수와 비슷하지만 정수 뿐만 아니라 부동소수점도 다루고 있으며 항목간의 값의 차이도 자유롭게 설정할 수 있다.

- linspace는 1차원 배열만 생성해준다

- num 인자값은 생성할 값의 개수를 지정해준다. 가능한 범위 내에서

- 균일하게 간격을 제공해준다. 만약, num을 지정하지 않으면 기본값으로 50이 설정된다.

- dtype 인자는 각 항목의 데이터 타입을 지정하는데 일반적으로 float이 기본 값으로 설정되어 있다.

- numpy.linspace(시작점, 끝점, num=간격(생성할 값의개수))

# 0부터 1까지를 5개로 구분
e = np.linspace(0,1.0,num=5)
print(e)
# 이거 언제 많이 사용될까? => 차트 시각화 (구간을 줘서 그림이 더 자연스럽게 나오도록)

f = np.linspace(0,1.0,num=7)
print(f)

a = np.linspace(0, 1, num=7, dtype=np.int16)
print(a)

c = np.linspace(0, 1, num=7, endpoint=True, dtype=np.float16)
print(c)

d = np.linspace(0, 1, num=7, endpoint=False, dtype=np.float16)
print(d)

- endpoint 인수는 True로 하면 end로 지정한 값을 종료점 삼고 False로 하면 end값을 기준값으로 포함하지 않고 균일하게 값을 구분한다.

[ empty 함수 ]

- 초기화하지 않은 넘파이 배열을 생성한다.

- 특정 데이터를 직접 입력한 것이 아니기 때문에 쓰레기 데이터 값이 저장되어 있다.

- 즉, 데이터가 초기화되지 않아서 출력값을 예측할 수 없다.

import numpy as np

a = np.empty((2,2), dtype='int16')
print(a)
print()

# C는 행 우선으로 값을 채운다.
# F는 열 우선으로 값을 채운다.
b = np.empty((3,2), dtype='float16', order='C')
print(b)
print()

 

- eye 함수 : 대각선 위치에 1을 채우고 나머지는 0을 채운다

a = np.eye(4,dtype='int16')
print(a)
print()

b = np.eye(6)
print(b)
print()

 

- ones 함수 : 배열의 모든 항목을 1로 초기화한 배열을 생성한다

a = np.ones((3,3), dtype=np.int16)
print(a)
print()

a = np.ones((2,3,3), dtype=np.int16)
print(a)
print()

a = np.ones(6,dtype=bool)
print(a)

 

- zeros 함수 : 배열의 모든 항목을 0으로 초기화한 배열을 생성한다.

a = np.zeros(6)
print(a)

 

- full 함수 : 사용자가 원하는 수로 배열의 모든 항목이 초기화한다.

a = np.full((3,3), 3.14)
print(a)

a = np.full(5,'bigdata', dtype='<U8')
print(a)

 

- 글자의 크기를 잘라내는 것도 가능하다 (<U3 => 앞에서부터 3글자만 출력한다.)

a = np.full(5,'bigdata', dtype='<U3')
print(a)

 

- 인덱싱도 가능하다

a[3] = "인공지능"
print(a)

 

import numpy as np

b = np.array([[1,2,3],[10,20,30],[0,0,-1]])
print(b)
print()

b_data2 = np.copy(b)
print(b_data2)
print(id(b))
print(id(b_data2))
print()

b_data3 = b
print(b_data3)
print(id(b))
print(id(b_data3))

: 위의 코드 블럭을 살펴보자. 이는 깊은 복사와 얕은 복사의 차이를 보여주는 코드이다. b_data2가 깊은 복사로 b와 주소값이 다르다. b_data3는 얕은 복사로 b와의 주소 값까지 같다.

 

- fromfunction 함수 : 배열을 생성하는 함수

- numpy.fromfunction(사용자정의함수명, 배열공간값, dtype)

import numpy as np

def simple(n):
    return n+1

a = np.fromfunction(simple, (5,), dtype='int32')
print(a)
print()

def add_it(r,c):
    return r+c

b = np.fromfunction(add_it, (5,5), dtype='int32')
print(b)
print()

c = np.fromfunction(lambda r, c : r+c, (5,5), dtype='int32')
print(c)
print()

예제)

import numpy as np

def ggd(r, c):
    r = r+1
    c = c+1
    return r*c

b = np.fromfunction(ggd, (9,9), dtype='int32')

# 2단부터 출력하게 하려고 배열구조로 바꿔놓고, 슬라이싱 해버림
s = np.array(b)
s = s[1:, 0:9]
s = np.transpose(s)
# []괄호 없애려고 문자열의 형태로 바꿔주기 위해서 replace()함수를 사용한다.
s = str(s)
s = s.replace('[', '')
s = s.replace(']', '')
s = s+''
print(s)

d = np.fromfunction(lambda r,c : (r+1)*(c+1), (9,9), dtype=np.int16)
print(d)

 

[ 0823 총정리 ] 

1. numpy, pandas가 라이브러리

2. 사용자 정의 함수? ==> 메모리 관리의 효율성 높아짐, 재사용의 용이성

        - 그런데 내부에서는 기억하지만 밖에서는 거의 기억을 못한다. 그래서 클로져 사용 closure

        - 아니면 전역변수나 global 함수 쓰던지

3. 람다함수, 재귀함수 ==> 간결함

4. 모듈(module) 역시 사용자 정의 함수처럼 만들어서 사용할 수 있다.

   - 모듈은 물리적인 파일로 구성되어 있어서 하드디스크 어딘가 저장되어 있다.

   - 외부모듈은 인터넷에서 다운받아서 사용해야 한다 (Terminal : pip install 모듈명, Jupyter : ! pip install 모듈명)

   - module을 import해와서 불러온 뒤 module의 함수를 사용한다

5. 클래스 (class)는 반복적인 키워드들을 줄여 코드를 더 간결하게 만들 수 있다,.

   - 데이터가 알아서 2차원 배열, 1차원 배열을 구성해서 데이터를 입력해준다

   - 그런데, 클래스 안에도 클래스를 또 집어넣을 수 있다.(부모와 자식처럼 구성될 수 있음) ==> 상속

   - 클래스와 클래스 끼리 붙어서 같이 연동해서 사용할 수 있다 ==> 포함

       => 상속관계나 포함관계가 용이한 이유는 바로 기존 코드를 수정할 필요가 없다는 점이다.

   - 조금 더 key값 같은거에 대해서 잘못 입력하는 (오타)의 실수를 줄인다.

6. __main__, __test_m2__ : 모듈을 만들 때 현재 내가 쓰고있는 함수가 내부의 함수인지, 외부의 함수인지를 판단할 수 있다.

7. 캐멀 케이스 : 변수명을 만들 때 첫글자가 대문자로 시자하는 용어 (class 클래스)

8. 스네이크 케이스 : 변수명을 만들 때 첫글자가 소문자로 시작하는 용어 (변수, 함수)

    => print() vs print ====> ()가 붙으면 함수, 괄호 없으면 함수

LIST