검색
검색
공개 노트 검색
회원가입로그인

[이솦] 파이선으로 배우는 AI 기초 22

요약
  • numpy는 다양한 수학적 연산을 위한 파이썬 라이브러리이며, 배열과 행렬에 대한 연산을 수행할 수 있다.
  • 다차원 배열의 모양을 변경할 때는 reshape() 함수를 사용하고, 요소별 합계, 평균, 중앙값, 최댓값, 최솟값 등을 계산할 수 있다.
  • 행렬 연산에 있어서 조건식과 브로드캐스팅을 활용하여 다양한 조건에 따른 연산이 가능하다.

이솦 | EBS 소프트웨어·인공지능 교육

이미지 인식을 위해서 사용되는 대표적인 딥러닝 모델중 cnn모델이 있다. 이미지의 특징을 추출하는 convolution 영역과 추출된 이미지 특성을 이용해서 이미지를 분류하는 기능을 학습하는 영역으로 구성되어 있다. convolution nueral network라고 불리운다. 다수의 이미지 인식 시스템에서 잘 사용하고 있고 가장 널리 사용되는 모델이기도 하다. 이미지 형태가 행렬 형태로 바뀌어 지며 연산에 사용되고 특징이 추출되어 이미지 분류에 이용된다. 즉 훈련과정에서 tensor의 형태를 바꾸는 연산이 끊임없이 일어난다. numpy는 행렬 연산도 하지만 행렬의 꼴을 바꾸어 주는 기능을 제공한다.

오늘은 numpy의 reshape()함수를 이용해서 행렬의 꼴 변환을 학습해 보자.

numpy

numpy는 배열 요소값에 대한 연산을 할수 있는 함수를 제공한다.

sum(), mean(), median(), max(), min()함수는 빈번하게 사용된다. 각 함수의 사용법을 알아보자.

sum()

sum()은 요소의 합을 구하는 함수이다.

import numpy as np
arr1 = np.array([[1,2,3], [4,5,6]])
print(np.sum(arr1))

이렇게 만들어진 3*2 행렬에서 전체 요소를 더해 줘서 결과가 나오게 된다. 행과 열이라는 축이 있을때 별도 연산이 가능하다. 머신러닝에서도 행만 처리하거나 열만 처리하는 경우가 꽤 있다. 3차원 연산인 tensor에서도 축의 값을 처리할때가 많으니 축별 연산을 숙지해 놓으면 좋다.

np.sum(arr1, axis=0)

이렇게 하면 열의 각 행값을 더하는 결과가 나온다. 혼동될 때가 있는데

주의할점은 행(axis=1)기준일때 행 값을 더한다. 열 (axis=0)기준일때, 열값을 더한다. 행 기준일떄는 행을, 열 기준일 때는 열을 한다는것을 기억해야 한다.

이번에는 axis를 1로 해보자.

np.sum(arr1, axis=1)

각 행의 열값을 더하라는 의미이다.

mean()

mean()함수는 요소의 평균을 구하는 함수이다.

np.mean(arr1)

이렇게 하면 전체 요소의 평균이 나온다.

그럼 mean()함수도 행,열 따로 처리가 가능하다. 여기에서도 axis를 사용한다.

np.mean(arr1, axis=1)

각 행의 평균을 출력한다.

median()

median()함수는 요소의 중앙값을 구하는 함수이다. 중앙값과 평균값은 다르다. 생각보다 머신러닝에서 중앙값을 빈번하게 사용한다. 만약 15개의 값을 정렬하였을때 중앙에 있는 값이다. 즉 8번째 있는 값이다.

arr2 = np.array([[4, 3, 6, 7, 8], [1, 2, 3, 6, 5], [3, 1, 4, 2, 6]])
np.median(arr2, axis = 0)

이렇게 5*3 행렬을 만들고 행축의 중앙값을 찾아 보자. 이렇게 하면 각 행축의 중앙값 5개를 찾아 준다. 벡터든 배열이든 numpy에서는 배열을 많이 사용한다. 즉 벡터든 행렬이든 numpy에서는 배열을 사용한다. 1차원 배열이면 벡터, 2차원 배열은 행렬이다.

max(), min(()

요소에서 가장 큰값과 가장 작은 값을 찾는 함수이다.

print(np.max(arr2))
print(np.min(arr2))

이렇게 결과가 나오며 당연히 이 함수들도 축별로 연산이 가능하다 .

배열에 대한 함수 대부분은 축별로 연산 가능하다.

조건식

이번에는 배열 요소에 조건식을 적용해 보자.

행렬 내부의 요소에 대해 검사를 해서 이상치를 보거나, 찾을때 유용할수 있다.

print(np.all(arr2>0))

이러게 하면 요소값 모두 all 을 0보다 큰지 확인해서 맞다면 true, 만약 하나라도 틀린다면 false를 반환해 준다. 즉 반환값은 불린이다. ture아니면 false이다.

이번엔 any()이다.

요소의 값중 한개라도 조건에 만족하면 true아니면 false로 반환한다.

print(np.any(arr2<0))

이렇게 하면 0보다 작은것은 없기에 false값을 반환해 준다.

where()는

요소의 값이 조건에 해당된다면 요소의 값을 변경하는 함수이다.

np.where(arr2>3), arr2, 0)

arr2에서 3초과하는건 그대로 두고 아니면 0으로 변환하라는 뜻이다.

행렬 요소를 조건에 따라 변경하는 매우 유용하게 쓸수 있다.

딥러닝 프로그램작성시 모양을 변경하는 작업을 많이 사용한다. 행렬및 tensor의 차원 즉 모양을 변경하는 일이다. 차원이라면 이해가 잘 안되겠지만 꼴이라고 이해하면 된다. 예를 들어서 2*3의 행렬을 3*2로 바꾸는것이다. 요소의 갯수는 같다.

reshape() 함수로 배열의 꼴을 변경한다.

arr2.reshape(5,3)

이렇게 해주면 원래 3*5행렬을 5*3 행렬로 변경할수 있다.

중요한 점은 변경전 요소의 갯수와 변경후 요소의 갯수가 항상 같아야 한다. 요소의 갯수가 다르면 reshape()함수는 사용 불가 이다.

머신러닝 프로그램을 작성하다 보면 다른 보양의 배열을 연산할때가 많다. 이때는 다음 두 조건중 하나만 만족하면 연산이 가능하다.
브로드 캐스팅은 서로 다른 모양의 배열을 특정 조건에 막족하면 연산이 가능하게 만드는 기능이다.

조건은

한 배열의 차원이 1차원 일때

첫 번째 배열의 행의 개수와 두번째 배열의 열의 개수가 같을때 이다.

두번째 조건은 행렬곱을 할 때 언급했다.

코드를 통해서 보자.

arr3 = np.array([[1, 2], [3, 4], [5, 6]])
arr4= np.array([[2, 2, 2]])
print(arr3.reshape(2,3) + arr4)

arr3 은 3행 2열의 행렬이다. arr4는 1행 3열의 행렬이다. 그래서 그냥 하면 안되고 reshape으로 arr3을 변경하고 더하는게 가능하다. 이런식으로 곱하기 연산도 가능하다.

실습

오늘 배운 reshape()를 써보자.

import numpy as np

myarr = np.arange(1,26).reshape(5,5) -1
print (myarr)

이렇게 하면 1-25까지의 1차원 배열을 5*5의 행렬로 만들고 1씩 빼주는 것이다.

요약

numpy 라이브러리는 배열에 대해서 sum(), mean(), median(), min(), max() 등의 다양한 함수를 제공한다.

행렬을 다루는 함수는 axis라는 옵션을 이용하여 행과 열을 별도로 처리할수 있다.

벡터, 행렬, 텐서등은 컴퓨터에서 배열을 이용해서 만든다.

배열의 모양을 바꿀때는 reshape() 함수를 사용한다.

공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
조회수 : 46
heart
T
페이지 기반 대답
AI Chat