[2022 국민대학교 겨울 인공지능 특강] 3주차 1일 학습 내용

하지원·2022년 1월 18일
0

이번 3주차 부터는 numpy 모듈을 다루는 여러 실습을 한다.

파이썬에서 numpy를 불러올 때 import numpy as np 코드를 작성한다.

리스트를 배열로 변환할 경우 사용하는 모듈이기도 하다. np.array()를 이용하며, 괄호안에 리스트를 입력하는 방식이다.
예) array = np.array([1, 2, 3, 4, 5])

이렇게 배열을 이용할 경우 할 수 있는 것들이 많아지는데, 그 중 하나는 크기 확인이다.
.shape()
예를 들어, ([[[1, 2, 3], [1, 2, 3]], [[2, 3, 4], [4, 5, 6]]])와 같이 3차원 배열에서는 행과 열의 길이가 각각 2여서 (2, 2, )로 시작하고, 그 안에 있는 리스트의 길이가 모두 3인 관계로 최종적으로 (2, 2, 3)을 얻게된다.

특정 크기의 배열을 생성하려할 경우 np.zeros()나 np.ones()등의 괄호 내에 튜플 혹은 리스트의 형태로 크기를 입력한다.
예) np.ones((2, 1, 3)) or np.ones([2, 1, 3]): 행 개수가 2, 열 개수가 1, 각 원소 내의 개수가 3인 배열
[[[1. 1. 1.]]
[[1. 1. 1.]]]

배열 내의 데이터가 무작위가 나오도록 할 수도 있다.
np.random.randn(): 크기만 설정 가능
np.random.normal(loc= , scale= , size=()): 평균, 표준편차, 크기 설정가능
np.random.randint(a, b, size=()): 숫자의 범위(a이상 b미만)와 크기 설정 가능

배열의 특정 요소를 불러오려면 해당 데이터의 인덱스 값을 입력하면 된다.
예를 들어 arr = [1, 3, 10, 55, 31, 12, 15]에서 1을 불러오기 위해서는 0번째 인덱스이기 때문에 arr[0]을 입력한다. 55를 불러오려면 arr[3]을 입력한다.
arr = [[1, 2, 4], [12, 15, 17]] 처럼 다차원 배열일 경우를 생각해보자. 여기서 12를 불러오고 싶다고 가정한다면, 1번째 행과 0번째 열에 있으므로 arr[1][0]을 입력하면 된다. arr[1, 0]도 가능하다.
특정 데이터를 불러오는 것이 가능하다면, 그 데이터를 변경하는 것도 가능하다. arr = [1, 2, 3, 5, 8, 13, 19]에서 19를 21로 바꾸기 위해 6번째 인덱스인 19를 arr[6]를 입력한뒤, arr[6] = 21 코드로 해당 데이터에 21을 저장하는 것이다.

덧셈, 뺄셈, 곱셉, 나눗셈 연산도 가능하다. 연산을 진행할 두 배열 사이에 (+ - /) 중 하나를 입력하면 된다. 단, 서로 크기가 같아야 한다.
예)
arr_A = np.array([[3, 6], [2, 7]])
arr_B = np.array([[4, 5], [1, 8]])
result = arr_A
arr_B
-> [[12 30][ 2 56]]

위와 같은 요소별 곱셈 외에 행렬곱을 할 경우 다음과 같은 코드가 필요하다.
우선 두 행렬 변수 a, b가 필요하며, a.dot(b) 혹은 np.dot(a, b)로 진행한다.

[[a1, a2], [a3, a4]] dot [[b1, b2], [b3, b4]]

  • [[(a1b1+a2b3), (a1b2+a2b4)], [(a3b1+a4b3), (a3b2+a4b4)]]

마지막으로 배열 슬라이싱(slicing)이다. 배열의 특정 구간의 데이터를 불러오는 방식인데, 몇번째 배열부터 몇번째 배열까지 불러올지 결정한 뒤, 그 범위를 정한다.
예를 들어, li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]에서 3에서 6까지 불러오기 위해서는 3과 6은 각각 2번째 인덱스와 5번째 인덱스에 위치하기 때문에 li[2:6]을 선언한다. 2이상 6미만의 인덱스를 입력하며, 시작 인덱스와 끝 인덱스+1의 값을 입력한다.
슬라이싱을 이용해서 특정 구간의 데이터를 모두 원하는 숫자로 변경하는 것도 가능하다. 3에서 6까지 모두 0으로 바꾸기 위해서 위에서 선언한 li[2:6]에 0을 저장하면 되는 것이다. -> li[2:6] = 0
2차원 배열도 당연히 슬라이싱 할 수 있다.
li = [[1, 2, 3, 4, 5],
[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9],
[10, 11, 14, 15, 17]
]
위 행렬에서 [[6, 7], [7, 8]]을 불러오고 싶다고 가정하자면, (1, 2)에서 (2, 3)까지 슬라이싱 해야하며, 선언할 때는 li[1:3][2:4]를 선언한다.
물론 특정 구간의 값을 변경하는 것도 가능하다.
예를들어, (1, 1)에서 (2, 2)까지 [[10, 20], [30, 40]]로 변경하기 위해서 arr[1:3, 1:3] = np.array([[10, 20], [30, 40]])을 선언해주면 된다.

profile
국민대 전자공학부, 서강대학교 석사과정, 크래프톤 정글 2기

0개의 댓글