*주피터 노트북이 없다면 주피터 노트북 다운과 활용법을 알고 보세요
*파이썬이 잘 잡혀있지 않는다면 하지 않는거를 추천드립니다
(잘 잡혀있다 기준(주관) : 모듈, 예외처리,패키지,클래스,함수에 대한 개념 이해가 되었고 활용까지 가능한 사람)
1 . Numpy
Numpy는 외부 라이브러리이다. ‘외부’ 라이브러리란 일반 파이썬에서 포함되지 않은 라이브러리라는 의미이다. (Numpy를 깔고오지 않으신 분들은 깔고오는걸 추천한다)
우선 Numpy를 import 해보자
라이브러리를 읽기 위해서는 import문을 해준다. Import numpy as np를 해석하면 numpy라이브러리를 np라는 이름으로 가져오라는 뜻이다.
그 다음 numpy라이브러리를 생성해 보자.
numpy배열을 만들 때는 np.array()메서드를 이용한다 이 메서드는 리스트를 인수로 받고 numpy라이브러리가 제공하는 특수 형태의 배열(numpy.ndarray)을 반환한다.
numpy배열로는 산술 연산 또한 수행 할 수 있다.
여기서 주의할 점은 이것이다.
용어
--------------------------------------------
원소별 : element – wise
원소별 곱셈 : element – wise product
-------------------------------------------
넘파이 배열은 위에서 보았던 원소별 계산 뿐만 아니라 넘파이 배열과 수치 하나(스칼라 값)의 조합으로 된 산술 연산도 가능하다. 스칼라 값과 넘파이 배열의 원소가 한번씩 계산이 수행되는것을 브로드캐스트(Broadcast)기능이라고 한다.
2 . Numpy N차원 배열
넘파이는 1차원 뿐만 아니라 다차원 배열 작성도 지원한다. 2차원 배열을 작성한다고 하면 다음과 같이 작성해 주면 된다.
여기서 차원이란 각각 1줄로 늘어선 배열을 의미하는데 여기서는 [1,2,3,4]가 첫번쨰 차원이 되되는 것이고 쉼표(,)를 기준으로 차원이 분류되어 [5,6,7,8]이 두번째 차원, 총 2차원 배열이 생성되는 것이다. 해당 행렬의 형상은 .shape로, 행렬 내 데이터들의 자료형은 .dtype로 알 수 이있다. 단 shape와 dtype에 대해 괄호는 써주면 안된다. 그 이유는 shape와 dtype는 튜플 형식으로 값을 반환하는데 튜플에 대해서는 값을 불러올 수 없기 때문이다.(튜플성질 : 값을 변화시킬 수 없다)여기서 형상이란 각 차원마다 담긴 원소의 수(크기)를 의미한다.
shape함수의 결과 값은 다음과 같은 의미를 가지고 있다.(총 차원의 수, 형상)
형상이 동일한 행렬끼리면 행렬 산술 연산도 가능하다. 이때 연산은 대응하는 원소별로 계산된다(동일한 색인에 위치한 값끼리).뿐만 아니라 브로드캐스팅 기능도 가능하다.
넘파이 배열은 N차원 배열을 작성할 수 있다. 수학적으로
1차원 배열 -> 벡터
2차원 배열 -> 행렬
3차원 이상 -> n차원 배열
이라고 부른다.또한 벡터와 행렬을 일반화한 것을 텐서(Tensor)라고 하며 구글의 딥러닝 라이브러리인
Tensorflow에서의 Tensor또한 여기서 유래되었다.
3 . 브로드캐스트(Broadcast)
넘파이 라이브러리에서는 형상이 다른 배열끼리도 곱할 수 있다. 앞에서 다루었던
브로드캐스트 기능을 한번 보자
다음과 같이 ex1이라는 2차원 배열이 되어있는 넘파이 배열이 있다. 밑의 ln[28]부분을 보면 ex1 이라는 넘파이 배열을 2로 나누는 연산을 하는데 우리가 흔히 생각할 때는 이것이 단지 2 라는 값이 각 차원의 배열에 돌아다니면서 2로 나누겠지 라고 생각할 수 있다. 하지만 이는 크나큰 오해이다. 현재 ex1 배열은 5 x 2크기의 행렬인데 ex1 / 2 라는 명령이 실행될 때는 모든 색인의 값이 ‘2’ 인 5 x 2크기의 행렬이 만들어 지는것이다.
좀 더 쉽게말하면 (?) = np.array([[2,2,2,2,2],[2,2,2,2,2]]) 라는 배열로 확대되고 나서
Ex1 / (?)가 되는것이다. 이러한 기능을 ‘브로드캐스트’기능이라고 명칭한다.
브로드캐스트의 예로는 다음과도 들 수 있다. 임의의 넘파이 배열을 선언하고나서 연산을 할 때 형상이(각 차원마다 동일한 크기(개수)) 동일한 넘파이 배열을 만들고 연산할 수도 있다.
여기서 또한 ex3라는 배열은 3 x 2크기의 행렬인데 ex3 / ex4를 할때는 ex4 또한 3 x 2크기의 행렬로 확장이 되어 연산이 진행된다.
4 . 원소 접근
배열 인덱싱은 파이선에 대한 기본 이해가 끝났다는 전제하이기에 하지 않겠다.
qw라는 2차원 배열이 있다 이를 만약 내가 1차원 배열로 바꾸고 싶다고 한다면 .flatten()메소드를 사용해 주면 된다.
하지만 하나 알아두어야 할 것은 .flatten()메소드를 통해 1차원 배열이 된 것은 해당 배열 자체가 저장되는 것이 아닌 일시적인 것이므로 1차원 배열로 바꾼 값을 사용하고 싶다면 기존 혹은 새로운 변수에 재 저장해주어야 한다.
그 후 1차원 배열이 저장된 변수에 대해 특정 인덱스(색인)값을 출력하고 싶다면 다음과 같은 형식으로 해주면 된다
(변수명)[np.array([(색인번호)])]
색인번호 안에는 여러 개가 들어가도 된다.
다음과 같이 행렬이든 벡터든 해당 값에 대해 일정 조건에 충족하는 값들도 따로 출럭할 수 있다.
(배열 변수명) (> = < ….etc) (조건) -> Bool자료형 결과값을 출력한다
(배열변수명)[(배열변수명) (> = < ….etc)(조건)] -> 조건에 충족하는 값들을 ‘1차원배열’로(벡터) 출력
5 . Matplotlib 모듈
딥러닝 실험에 있어서는 데이터 시각화, 즉 그래프 또한 매우 중요하다. 그래프를 그릴 때 사용하는 라이브러리는 바로 matplotlib이다. Matplotlib를 사용하면 그래프 그리기와 데이터 시각화가 쉬워진다.
Matplotlib가 그래프를 그려주는 라이브러리인 만큼 그래프를 그려보자. 그래프를 그려주기 위해서는 matplotlib의 pyplot모듈을 이용한다.
우선 여러 수학적 함수와 배열 행렬 연산을 해주는 numpy 를 import 해준다. 그 다음 pyplot모듈을 matplotlib의 하위 모듈이므로 matplotlib.pyplot as plt (matplotlib모듈의 하위모듀린 pyplot를 plt라는 이름으로 불러온다. 여기서 꼭 plt라는 이름으로 불러오지 않아도 된다.)로 pyplot모듈을 불러온다. 만약 matplotlib.pyplot의 의미가 이해가 안된다면 패키지를 다시 공부하고 오자.
만약 sin()함수를 그리고 싶다고 가정해 보자.
그럴 경우 다음과 같이 나타내 줄 수 있다.
하나 하나 살펴 보자. 우선 2차원 그래프 상으로 본다면 qw는 우리가 흔히 말하는 x축에 속하속하는 것 qa는 y축에 속하는 것이다. qw라는 변수에는 np.arange(0,10,0.5)라고 작성하였다. 이 코드의 의미는 qw라는 변수에 리스트 형태로 0부터 시작해서 0.5 간격으로 값을 생성하여 대입하겠다는 것이다. 시각적으로 보면 [0,0.5,1,1.5,2,2.5 ……. 9.5] 로 표현해 줄 수 있다.
하나 주의해야 할 점은 np.arange(x,y,z)라고 한다면 arange()메서드의 실질적 범위는
x <= ~ <y 가 된다. 즉 최종값인 y는 값에 포함시키지않는다는 의미이다.
그 다음 qa = np.sin(qw)라고 되어있다. 이 코드에서 np.sin()이라고 되어있는 것은 넘파이 모듈의 sin메서드를 통한 연산 값을 나타내겠다는 것을 의미하는데 sin의 괄호 안에 인자는 sin연산을 해줄 값을 넣어주는 것이다. 위에서 말했듯이 qa의 값은 y축의 값이다. 우리가 흔히 함수를 y = sin(x)와 쓰는 것을 동일히 생각하면 된다. 그렇기에 우리는 x축의 기준값으로 qw안에 저장된 데이터를 이용할 것이기 떄문에 sin()함수의 인자로는 qw 데이터 변수를 넣어주면 되는것이다.
그 다음 plt(앞에서 그래프를 그려주는 메서드인 pyplot을 불러올 때 부여한 이름).plot()을 통해 x축 y축 인자를 넣어준다. .plot()메서드의 인자 순서는 다음과 같다.
Plt.plot((x축값),(y축값))
그 다음 결론적으로 계산되고 완성된 그래프를 가져올때는 plt.show()라는 명령을 통해 그래프를 나타낼 수 있다. sin뿐만 아니라 cos, tan 함수도 모두 나타낼 수 있다.
좀 더 나아가 sin함수와 cos함수를 비교하는 예제를 만들어 보자. 여기서 조건은 cos함수는 점선으로 표시해야 된다는 조건이 붙는다.
위의 코드를 보자. 우선 동일하게 numpy모듈과 pyploy모듈을 호출한다. 그 다음 x축값에 넣어줄 값들을 저장하고 y축값에 대해 넣을 값은 cos에대한 값 하나, sin에 대한 값 하나 총 두가지의 데이터를 생성해준다. 그 다음 동일히 그래프를 그리기 위해 plot에 sin, cos에 대해 각각 순서대로 x축값 y축값을 넣어준다.
그 다음 .legend()메서드를 통해 그래프에 대한 범례를 넣어주기 위해 cos, sin 각각 그래프를 작성하는 plot()메서드 안에 label값에 범례명을 대입해 준다. 위에서 작성자가 제시한 조건으로는 cos함수는 점선으로 표시가 되어야 한다고 했기에 linestyle값에 대해서는 점선을 의미하는 ’--' 을 넣어준다. 점선을 의미하는 ‘--‘표시는 고정문법이다. 다른 형태로 점선이나 그래프 라인 스타일을 변경할 수 없다.
그 후 x축, y축에 이름을 부여하기 위해 x축은 .xlabel() 메서드의 인자에 x축 이름을, y축은 .ylabel() 메서드의 인자에 y축 이름을 넣어준다
마지막으로 .legend()메서드를 이용하여 그래프의 범례(어떤 것이 어떤 그래프인지 등 각 데이터에 대한 의미를 표기해주는것을 의미)를 나타내 주고 .show()를 통해 그래프를 출력한다.
pyplot모듈에는 imshow()라는 사진을 출력해주는 메서드가 존재하며 matplotlib의 image모듈에는 imread()라는 사진을 불러오는 메서드도 존재한다. 이 두 메서드를 이용하여 사진을 출력할 수 도 있다. 이 코드를 실습할 때 주의할 점은 자신이 불러올 사진은 자신이 작성중인 코드와 동일한 디렉토리에 있어야한다.(물론 디렉토리를 따로 지정하여 불러올 수도 있다.)
이번에는 딱히 행렬 및 수학적 연산은
필요하지 않기 때문에 numpy모듈을 호출하지 않았다. 대신
이번에는 imshow()메서드를 사용하기 위해 matplotlib의
pyplot메서드를, 또 출력할 사진을 불러오기 위한 imread()메서드를 사용하기 위해 matplotlib의 image메서드를 호출해준다. 그 후 imread()메서드의 인자에 사진명과 확장자를 문자열 형태로 집어 넣어주고 (‘(파일명).(확장자명)’) 이를 임의의 변수에 넣어준다. 그 후 imshow()메서드에 자신이 출력할 사진에 대한 데이터를 가진 변수를 인자로 넣고 동일하게 plt.show를 통해 그래프 형태로 이미지를 출력하면 된다.
'Machine Learning &DeepLearning > Machine Learning Base Theory' 카테고리의 다른 글
Machine Learning with Python #3 - 1 (0) | 2019.01.22 |
---|---|
Machine Learning with Python #2 (0) | 2019.01.14 |