Skip to main content

02. 파이썬 기본 문법

About 6 minPythoncrashcoursepythonpygooglegoogle-colabjupyter-notebooknumpypandasipython

02. 파이썬 기본 문법 관련


02. 파이썬 기본 문법

금융 데이터 분석을 위한 파이썬 - WikiDocs

01. 주석 (Comment)

앞서 앞으로의 모든 실습은 Colab 또는 주피터 노트북에서 실행한다고 가정한다고 언급한 바 있습니다. 이를 유념해주세요.

주석이란?

파이썬에서 앞에 #을 붙여서 작성하는 경우를 주석이라고 합니다. 영어로 comment이구요. 실제 코드가 아니므로 실행되지 않습니다. 일종의 메모를 위한 것이라고 보시면 됩니다. 아래와 같이 코드를 실행해봅시다.

# 이렇게 앞에 #을 붙여서 작성하는 경우를 주석이라고 합니다.
# 영어로 comment이구요. 실제 코드가 아니므로 실행되지 않습니다.
# 일종의 메모를 위한 것이라고 보시면 됩니다.

2 + 5
#
# 7

2 + 5의 결과로 7이 나옵니다. #을 붙여서 작성한 코드는 실제 결과에 영향을 주지 않습니다. 여러분들이 작성한 코드라고 하더라도 며칠 뒤에 다시 읽어보면 이 코드가 어떤 의도로 왜 작성되었는지 헷갈리는 경우가 있습니다. 이럴 경우를 위해 코드 작성 시에 사용하는 것이 주석입니다. 저의 경우에는 여러분들에게 파이썬 코드의 설명을 돕기위한 용도로도 사용할 것입니다.

또 다른 방식 : 블록 단위 주석

위에서 #을 사용한 주석은 한 줄, 한 줄 주석을 남기고 싶을 때 사용하는 방법입니다. 5개의 줄에 주석을 남기고 싶으면 5개의 줄 모두 맨 앞에 #을 써주어야 합니다. 그런데 여러 줄에 대해서 동시에 주석을 사용하고 싶다면 작은 따옴표(')를 연달아 세개를 사용할 수도 있습니다. 한 번 아래의 코드를 실행해볼까요?

'''
이렇게 따옴표 3개로 시작하고 따옴표 3개로 끝나도록 시작과 끝을 정의해주고
그 사이에 주석을 작성할 수도 있습니다.
'''

2 + 5
# 
# 7

이전과 동일하게 7이란 결과를 얻습니다. # 으로 주석을 작성하거나 '''으로 주석을 작성하더라도 어차피 주석은 실행 결과에 영향을 끼치지 못하고 2 + 5만 실행되기 때문입니다. 두 개의 주석 작성 방식 중 어떤 방식의 주석을 사용해야 하는지에 대해서는 따로 정답이 없으므로 여러분들이 판단하기에 적절한 방법을 사용하여 주석을 사용하면 됩니다.

주석의 용도는 또 뭐가 있을까?

주석은 코드를 설명하기 위해서 메모를 남겨놓는 용도로도 사용하지만 상황에 따라서는 기존에 작성했던 코드를 지우고는 싶지 않지만, 임시적으로 배제시키는 용도로도 사용할 수 있습니다. 주석 처리되면 결과에 영향을 미칠 수 없기 때문입니다.

예를 들어 이런 상황을 가정해봅시다. 어떤 결과를 얻기 위해서 A 방식으로 코드를 작성했습니다. 그런데 갑자기 떠오른 아이디어가 있어서 B 방식으로도 코드를 작성해보려고 합니다. B 방식이 더 효율적일 것 같기 때문입니다. 하지만 A 방식의 코드를 다 지우기에는 아까워서 잠시만 주석 처리를 하려고 합니다. 이런 경우에는 다음과 같이 처리를 할 수 있습니다.

(상황을 가정한 것이므로 아래의 코드를 실제로 실행하진 마세요! 실제 실행되는 코드는 아닙니다.)

'''
A 방식의 코드
'''

B 방식의 코드

이렇게 코드를 작성하면 A 방식의 코드는 주석 처리되고 B 방식의 코드만 실행되겠죠?


02. 변수와 숫자 자료형

파이썬에서는 다양한 자료형(데이터 타입)이 존재합니다. 대표적인 자료형으로는 정수와 실수를 나타내는 숫자 자료형, 참과 거짓을 나타내는 불(boolean) 자료형, 문자를 나타내는 문자열 자료형, 여러 자료를 필요에 따라서 다르게 나타내는 리스트, 딕셔너리, 세트, 튜플이 존재합니다.

우선 변수의 개념과 숫자 자료형에 대해서 정리해봅시다.

변수와 print()

변수(variable)은 비유하자면 자료를 담을 수 있는 이름이 있는 상자입니다. 다르게 비유해보면 일종의 값에 이름을 붙이는 것입니다. 파이썬에서는 변수명 = 자료과 같은 방식으로 변수에 자료를 할당합니다. 여기서 자료는 그냥 간단하게 일종의 값을 의미한다고 생각하면 됩니다. 파이썬에서 값을 출력하는 방법으로는 print()를 사용합니다. 아 이런... 아직 아리송하죠? 실습을 통해 이해해봅시다. 막상해보면 별 내용이 아니라는 것을 아실겁니다. a라는 변수에 3이라는 값을 넣고 값을 출력해봅시다.

a = 3 
print(a)
#
# 3

a라는 변수에 3이라는 값을 넣은 뒤에 print()를 통해 a를 출력했더니 3이 출력되었습니다. 이해를 돕기위해서 이번에는 각 코드가 의미하는 바를 코드의 바로 위에 주석(comment)을 작성하여 재실행해봅시다.

# a에 3을 넣는다.
a = 3 

# a를 출력해라
print(a)
#
# 3

주석은 설명을 위한 용도이고 실행 결과에 영향을 끼치진 않으므로 결과가 바뀌진 않습니다. 다시 요약해서 정리해봅시다. 변수에 어떤 값을 넣는 방법은 변수명 = 값이구요. print(변수명)을 사용하면 해당 변수 안에 있는 값이 출력됩니다! 간단하죠?

변수끼리 연산하는 것도 가능합니다. 파이썬에서는 +는 두 개의 값을 더하라는 의미입니다. 두 개의 변수를 선언한 뒤에 두 개의 변수를 더한 값을 새로운 변수에 할당하고 그 변수의 값을 출력해봅시다.

a = 3
b = 5
c = a + b
print(c)
#
# 8

위 코드는 a란 변수에 3이란 값을 할당하고, b란 변수에 5란 값을 할당한 뒤에 두 개의 값을 더한 값을 c라는 변수에 할당한 뒤에 c란 변수를 출력하는 코드입니다. 참고로 print() 내에서 연산을 하는 것도 가능합니다!

a = 3
b = 5
print(a + b)
# 
# 8

숫자 자료형(int, float)

파이썬에서는 크게 숫자를 두 가지 자료형(데이터 타입)으로 구분합니다. 소수점이 없는 숫자를 정수형(int), 소수점이 있는 숫자를 실수형(float)입니다. 숫자 3과 소수점이 있는 숫자인 2.5 두 가지 숫자를 각각 변수 a와 b로 선언해봅시다.

a = 3
b = 2.5

파이썬에서는 데이터의 타입. 즉, 자료형을 확인하는 방법으로 type()을 사용합니다. 앞으로 많이 사용하게 될테니 기억해둡시다. 우선 a의 자료형을 확인해봅시다.

print(type(a))
#
# <class 'int'>

<class 'int'>라는 내용이 출력되는데요. 이는 해당 변수의 자료형이 정수형이라는 의미입니다. 정수형 자료형은 소수점이 없는 숫자라는 의미입니다. 이번에는 변수 b에 대해서 자료형을 확인해봅시다.

print(type(b))
#
# <class 'float'>

<class 'float'>라는 내용이 출력되는데요. 이는 해당 변수의 자료형이 실수형이라는 의미입니다. 실수형이란 소수점이 있는 숫자라는 의미입니다.

숫자 자료형(int, float)의 연산

숫자 자료형(int, float)끼리는 사칙연산을 포함한 다양한 연산이 가능합니다.

연산 기호의미
+덧셈
-뺄셈
*곱하기
**거듭제곱
/나누기
//나누기 연산 후 소수점 이하의 수는 버리고 정수 부분만 남긴다.
%나누기 연산 후에 나머지를 구한다.

실습을 통해 이해해봅시다. ab라는 변수를 선언해두고 덧셈을 수행해봅시다.

a = 7
b = 2

print(a + b)
#
# 9

7과 2의 덧셈 결과로 9를 얻습니다. 뺄셈을 해볼까요? 7에서 2를 빼봅시다.

print(a - b)
#
# 5

5라는 결과를 얻습니다. 이번에는 % 연산을 해봅시다. 위의 표의 설명에 따르면 % 연산은 나누기를 수행한 후에 나머지를 얻는다고 합니다.

print(a % b)
#
# 1

1이란 결과를 얻습니다. 실제로 7을 2로 나누면 몫은 3이고, 나머지는 1이기때문입니다. 나머지 연산들에 대해서도 직접 실습을 진행해보세요. a가 5이고 b가 2일 때, 저자가 실제로 수행해서 얻은 결과들은 다음과 같았습니다.

연산 기호수식결과의미
+a + b7a와 b를 더한다
-a - b3a에서 b를 뺀다
*a * b10a에 b를 곱한다
**a ** b25a의 b의 거듭제곱
/a / b2.5a에서 b를 나눈다
//a // b2a에서 b를 나누고 정수 부분만 남긴다 (나눗셈 연산 후의 몫)
%a % b1a에서 b를 나누고 나머지 부분만 남긴다 (나눗셈 연산 후의 나머지)

정리

  • 변수는 어떤 값을 담아두는 상자로 비유할 수 있다. 변수 = 어떤 값 과 같이 사용할 수 있다.
  • 예를 들어 a = 3이라고 변수 a를 선언 후에 print(a)를 실행하면 3이 출력된다.
  • 자료형은 파이썬에서 사용하는 데이터의 타입을 의미한다. 다양한 데이터 타입이 존재하는데 숫자 자료형에 대해서 학습했다.
  • 숫자 자료형은 크게 소수점이 없는 정수형 자료형 int와 소수점이 있는 실수형 자료형 float로 나뉜다.
  • 파이썬에서 자료형을 확인하는 방법은 type(변수)이다.
  • 숫자 자료형은 다양한 연산이 가능하다.

03. 문자열과 Bool 자료형

파이썬에서는 다양한 자료형(데이터 타입)이 존재합니다. 대표적인 자료형으로는 정수와 실수를 나타내는 숫자 자료형, 참과 거짓을 나타내는 불(boolean) 자료형, 문자를 나타내는 문자열 자료형, 여러 자료를 필요에 따라서 다르게 나타내는 리스트, 딕셔너리, 세트, 튜플 이 존재합니다.

여기서는 문자열 자료형과 불 자료형에 대해서 정리해봅시다.

문자열 자료형

불(Boolean) 자료형

불(Boolean) 자료형은 참/거짓을 나타냅니다. 다음과 같이 대문자로 시작하는 True나 False를 변수로 선언하고 type()을 통해서 자료형을 확인해보면 bool이라고 출력되는 것을 확인할 수 있습니다. 이는 불 자료형이란 의미입니다.

x = True # 참
y = False # 거짓

type(x)
# 
# bool

대문자로 시작하는 TrueFalse는 불 자료형이지만 소문자로 시작하는 true와 false는 불 자료형이 아닙니다. 이게 어떤 차이인지 실습을 통해 이해해봅시다. 만약 대문자가 아니라 소문자로 true나 false를 변수의 값으로 선언할 경우에는 에러가 발생합니다.

z = true
#
# NameError: name 'true' is not defined

이는 소문자로 쓰면 불 자료형으로 인식하지 않고 일종의 변수명이라고 인식하기 때문입니다. 지금 나오는 에러를 해석해보면 true라는 변수는 선언된 적이 없는데 호출하고 있어서 발생한 에러입니다. 이번에는 대문자 True를 변수명으로 사용해봅시다.

True = 1
#
#   File "<ipython-input-16-1598b51f0f76>", line 1
#     True = 1
#             ^
# SyntaxError: can't assign to keyword

이번에도 에러가 발생하는데 해당 에러는 True나 False는 불 자료형을 의미하며 불 자료형은 변수명으로 사용할 수 없기 때문에 발생하는 에러입니다.


04. 판다스, 넘파이, 맷플롯립

데이터 분석을 위한 필수 패키지 삼대장이 있습니다. 바로 Pandas와 Numpy 그리고 Matplotlib입니다. 세 개의 패키지 모두 아나콘다를 설치했다면 추가 설치 없이 사용할 수 있습니다. 이 세 개의 패키지를 간단히 실습해봅시다.

판다스(Pandas)

판다스(Pandas)는 파이썬 데이터 처리를 위한 라이브러리입니다. 파이썬을 이용한 데이터 분석과 같은 작업에서 필수 라이브러리로 알려져있습니다. 참고 할 수 있는 Pandas 링크는 다음과 같습니다.

📎링크: http://pandas.pydata.org/pandas-docs/stableopen in new window

아나콘다를 설치하지 않았다면 아래의 커맨드로 Pandas를 별도 설치할 수 있습니다.

pip install pandas
ipython
# 
import pandas as pd
pd.__version__
# Out[2]: '0.25.1'

Pandas의 경우 pd라는 명칭으로 임포트하는 것이 관례입니다.

import pandas as pd

Pandas는 총 세 가지의 데이터 구조를 사용합니다.

  • 시리즈(Series)
  • 데이터프레임(DataFrame)
  • 패널(Panel)

이 중 데이터프레임이 가장 많이 사용되며 여기서는 시리즈와 데이터프레임에 대해서 다룹니다.

시리즈(Series)

시리즈 클래스는 1차원 배열의 값(values)에 각 값에 대응되는 인덱스(index)를 부여할 수 있는 구조를 갖고 있습니다.

sr = pd.Series([17000, 18000, 1000, 5000],
               index=["피자", "치킨", "콜라", "맥주"])
print('시리즈 출력 :')
print('-'*15)
print(sr)
# 
# 
# 시리즈 출력 :
# ---------------
# 피자    17000
# 치킨    18000
# 콜라     1000
# 맥주     5000
# dtype: int64

값(values)과 인덱스(index)를 출력합니다.

print('시리즈의 값 : {}'.format(sr.values))
print('시리즈의 인덱스 : {}'.format(sr.index))
#
# 시리즈의 값 : [17000 18000  1000  5000]
# 시리즈의 인덱스 : Index(['피자', '치킨', '콜라', '맥주'], dtype='object')

데이터프레임(DataFrame)

데이터프레임은 2차원 리스트를 매개변수로 전달합니다. 2차원이므로 행방향 인덱스(index)와 열방향 인덱스(column)가 존재합니다. 다시 말해 행과 열을 가지는 자료구조입니다. 시리즈가 인덱스(index)와 값(values)으로 구성된다면, 데이터프레임은 열(columns)까지 추가되어 열(columns), 인덱스(index), 값(values)으로 구성됩니다. 이 세 개의 구성 요소로부터 데이터프레임을 생성해봅시다.

values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
index = ['one', 'two', 'three']
columns = ['A', 'B', 'C']

df = pd.DataFrame(values, index=index, columns=columns)

print('데이터프레임 출력 :')
print('-'*18)
print(df)
#
#
# 데이터프레임 출력 :
# ------------------
#        A  B  C
# one    1  2  3
# two    4  5  6
# three  7  8  9

생성된 데이터프레임으로부터 인덱스(index), 값(values), 열(columns)을 각각 출력해보겠습니다.

print('데이터프레임의 인덱스 : {}'.format(df.index))
print('데이터프레임의 열이름: {}'.format(df.columns))
print('데이터프레임의 값 :')
print('-'*18)
print(df.values)
#
# 데이터프레임의 인덱스 : Index(['one', 'two', 'three'], dtype='object')
# 데이터프레임의 열이름: Index(['A', 'B', 'C'], dtype='object')
# 데이터프레임의 값 :
# ------------------
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

데이터프레임의 생성

데이터프레임은 리스트(List), 시리즈(Series), 딕셔너리(dict), Numpy의 ndarrays, 또 다른 데이터프레임으로부터 생성할 수 있습니다. 여기서는 리스트와 딕셔너리를 사용하여 데이터프레임을 생성해보겠습니다. 우선 이중 리스트로 생성하는 경우입니다.

# 리스트로 생성하기
data = [
    ['1000', 'Steve', 90.72], 
    ['1001', 'James', 78.09], 
    ['1002', 'Doyeon', 98.43], 
    ['1003', 'Jane', 64.19], 
    ['1004', 'Pilwoong', 81.30],
    ['1005', 'Tony', 99.14],
]

df = pd.DataFrame(data)
print(df)
#
#       0         1      2
# 0  1000     Steve  90.72
# 1  1001     James  78.09
# 2  1002    Doyeon  98.43
# 3  1003      Jane  64.19
# 4  1004  Pilwoong  81.30
# 5  1005      Tony  99.14

생성된 데이터프레임에 열(columns)을 지정해줄 수 있습니다. 열이름을 지정하고 출력해봅시다.

df = pd.DataFrame(data, columns=['학번', '이름', '점수'])
print(df)
#
#      학번        이름     점수
# 0  1000     Steve  90.72
# 1  1001     James  78.09
# 2  1002    Doyeon  98.43
# 3  1003      Jane  64.19
# 4  1004  Pilwoong  81.30
# 5  1005      Tony  99.14

파이썬 자료구조 중 하나인 딕셔너리(dictionary)를 통해 데이터프레임을 생성해보겠습니다.

# 딕셔너리로 생성하기
data = {
    '학번' : ['1000', '1001', '1002', '1003', '1004', '1005'],
    '이름' : [ 'Steve', 'James', 'Doyeon', 'Jane', 'Pilwoong', 'Tony'],
    '점수': [90.72, 78.09, 98.43, 64.19, 81.30, 99.14]
    }

df = pd.DataFrame(data)
print(df)
#
#      학번        이름     점수
# 0  1000     Steve  90.72
# 1  1001     James  78.09
# 2  1002    Doyeon  98.43
# 3  1003      Jane  64.19
# 4  1004  Pilwoong  81.30
# 5  1005      Tony  99.14

데이터프레임 조회하기

아래의 명령어는 데이터프레임에서 원하는 구간만 확인하기 위한 명령어로서 유용하게 사용됩니다.

  • df.head(n) - 앞 부분을 n개만 보기
  • df.tail(n) - 뒷 부분을 n개만 보기
  • df['열이름'] - 해당되는 열을 확인

위에서 사용한 데이터프레임을 그대로 사용하여 실습해봅시다.

# 앞 부분을 3개만 보기
print(df.head(3))
#
#      학번      이름     점수
# 0  1000   Steve  90.72
# 1  1001   James  78.09
# 2  1002  Doyeon  98.43
# 뒷 부분을 3개만 보기
print(df.tail(3))
# 
#      학번        이름     점수
# 3  1003      Jane  64.19
# 4  1004  Pilwoong  81.30
# 5  1005      Tony  99.14
# '학번'에 해당되는 열을 보기
print(df['학번'])
#
# 0    1000
# 1    1001
# 2    1002
# 3    1003
# 4    1004
# 5    1005
# Name: 학번, dtype: object

외부 데이터 읽기

Pandas는 CSV, 텍스트, Excel, SQL, HTML, JSON 등 다양한 데이터 파일을 읽고 데이터 프레임을 생성할 수 있습니다.

예를 들어 csv 파일을 읽을 때는 pandas.read_csv()를 통해 읽을 수 있습니다. 다음과 같은 example.csv 파일이 있다고 합시다.

example.csv
example.csv
df = pd.read_csv('example.csv')
print(df)
#
#    student id      name  score
# 0        1000     Steve  90.72
# 1        1001     James  78.09
# 2        1002    Doyeon  98.43
# 3        1003      Jane  64.19
# 4        1004  Pilwoong  81.30
# 5        1005      Tony  99.14

이 경우 인덱스가 자동으로 부여됩니다. 인덱스를 출력해보겠습니다.

print(df.index)
#
# RangeIndex(start=0, stop=6, step=1)

넘파이(Numpy)

넘파이(Numpy)는 수치 데이터를 다루는 파이썬 패키지입니다. Numpy의 핵심이라고 불리는 다차원 행렬 자료구조인 ndarray를 통해 벡터 및 행렬을 사용하는 선형 대수 계산에서 주로 사용됩니다. Numpy는 편의성뿐만 아니라, 속도면에서도 순수 파이썬에 비해 압도적으로 빠르다는 장점이 있습니다.

아나콘다를 설치하지 않았다면 아래의 커맨드로 Numpy를 별도 설치할 수 있습니다.

pip install numpy
ipython
...
import numpy as np
np.__version__
# Out[2]: '1.16.5'

Numpy의 경우 np라는 명칭으로 임포트하는 것이 관례입니다.

import numpy as np

np.array()

Numpy의 핵심은 ndarray입니다. np.array()는 리스트, 튜플, 배열로 부터 ndarray를 생성합니다. 파이썬 자료구조 중 하나인 리스트를 가지고 1차원 배열을 생성해보겠습니다.

# 1차원 배열
vec = np.array([1, 2, 3, 4, 5])
print(vec)
# [1 2 3 4 5]

2차원 배열을 만들어보겠습니다. 주의할 점은 array() 안에 하나의 리스트만 들어가므로 리스트의 리스트를 넣어야 합니다.

# 2차원 배열
mat = np.array([[10, 20, 30], [ 60, 70, 80]]) 
print(mat)
# [[10 20 30]
#  [60 70 80]]

두 배열의 타입을 확인해봅시다.

print('vec의 타입 :',type(vec))
print('mat의 타입 :',type(mat))
# vec의 타입 : <class 'numpy.ndarray'>
# mat의 타입 : <class 'numpy.ndarray'>

동일하게 타입이 numpy.ndarray라고 나오게 됩니다. Numpy 배열에는 축의 개수(ndim)와 크기(shape)라는 개념이 존재하는데, 배열의 크기를 정확히 숙지하는 것은 딥 러닝에서 매우 중요합니다. 축의 개수와 크기가 어떤 의미를 가지는지에 대해서는 머신 러닝 챕터에서 벡터와 행렬 연산을 설명할 때 언급하겠습니다.

print('vec의 축의 개수 :',vec.ndim) # 축의 개수 출력
print('vec의 크기(shape) :',vec.shape) # 크기 출력
#
# vec의 축의 개수 : 1
# vec의 크기(shape) : (5,)
print('mat의 축의 개수 :',mat.ndim) # 축의 개수 출력
print('mat의 크기(shape) :',mat.shape) # 크기 출력
#
# mat의 축의 개수 : 2
# mat의 크기(shape) : (2, 3)

ndarray의 초기화

위에서는 리스트를 가지고 ndarray를 생성했지만 ndarray를 만드는 다양한 다른 방법이 존재합니다. 이 외에도 다양한 방법이 존재하므로 필요에 따라서 다양한 배열을 생성할 수 있습니다.

np.zeros

np.zeros()는 배열의 모든 원소에 0을 삽입합니다.

# 모든 값이 0인 2x3 배열 생성.
zero_mat = np.zeros((2,3))
print(zero_mat)
#
# [[0. 0. 0.]
#  [0. 0. 0.]]

이 외에도 Numpy에는 배열을 만드는 다양한 방법이 존재하므로 필요한 방법을 사용하여 배열을 생성할 수 있습니다.

np.arange()

np.arange(n)은 0부터 n-1까지의 값을 가지는 배열을 생성합니다.

# 0부터 9까지
range_vec = np.arange(10)
print(range_vec)
#
# [0 1 2 3 4 5 6 7 8 9]

np.arange(i, j, k)i부터 j-1까지 k씩 증가하는 배열을 생성합니다.

# 1부터 9까지 +2씩 적용되는 범위
n = 2
range_n_step_vec = np.arange(1, 10, n)
print(range_n_step_vec)
#
#[1 3 5 7 9]

np.reshape()

np.reshape()은 내부 데이터는 변경하지 않으면서 배열의 구조를 바꿉니다. 0부터 29까지의 숫자를 생성하는 arange(30)을 수행한 후, 원소의 개수가 30개이므로 5행 6열의 행렬로 변경해봅시다.

reshape_mat = np.array(np.arange(30)).reshape((5,6))
print(reshape_mat)
#
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]
#  [24 25 26 27 28 29]]

Numpy 슬라이싱

ndarray를 통해 만든 다차원 배열은 파이썬의 자료구조인 리스트처럼 슬라이싱(slicing) 기능을 지원합니다. 슬라이싱 기능을 사용하여 특정 행이나 열들의 원소들을 접근할 수 있습니다.

mat = np.array([[1, 2, 3], [4, 5, 6]])
print(mat)
#
# [[1 2 3]
#  [4 5 6]]

# 첫번째 행 출력
slicing_mat = mat[0, :]
print(slicing_mat)
#
#[1 2 3]

# 두번째 열 출력
slicing_mat = mat[:, 1]
print(slicing_mat)
#
# [2 5]

Numpy 정수 인덱싱(integer indexing)

슬라이싱을 사용하면 배열로부터 부분 배열을 추출할 수 있지만, 연속적이지 않은 원소로 배열을 만들 경우에는 슬라이싱으로는 만들 수 없습니다. 예를 들어서 2행 2열의 원소와 5행 5열의 원소를 뽑아서 하나의 배열로 만들고자 하는 경우가 그렇습니다. 이런 경우에는 인덱싱을 사용하여 배열을 구성할 수 있습니다. 인덱싱은 원하는 위치의 원소들을 뽑을 수 있습니다.

mat = np.array([[1, 2], [4, 5], [7, 8]])
print(mat)
#
#[[1 2]
# [4 5]
# [7 8]]

특정 위치의 원소만을 가져와봅시다.

# 1행 0열의 원소
# => 0부터 카운트하므로 두번째 행 첫번째 열의 원소.
print(mat[1, 0])
# 
# 4

특정 위치의 원소 두 개를 가져와 새로운 배열을 만들어봅시다.

# mat[[2행, 1행],[0열, 1열]]
# 각 행과 열의 쌍을 매칭하면 2행 0열, 1행 1열의 두 개의 원소.
indexing_mat = mat[[2, 1],[0, 1]]
print(indexing_mat)
# 
# [7 5]

Numpy 연산

Numpy를 사용하면 배열간 연산을 손쉽게 수행할 수 있습니다. 덧셈, 뺄셈, 곱셈, 나눗셈을 위해서는 연산자 +, -, *, /를 사용할 수 있으며 또는 np.add(), np.subtract(), np.multiply(), np.divide()를 사용할 수도 있습니다.

x = np.array([1,2,3])
y = np.array([4,5,6])
# result = np.add(x, y)와 동일.
result = x + y
print(result)
#
# [5 7 9]

# result = np.subtract(x, y)와 동일.
result = x - y
print(result)
#
# [-3 -3 -3]

# result = np.multiply(result, x)와 동일.
result = result * x
print(result)
#
# [-3 -6 -9]

# result = np.divide(result, x)와 동일.
result = result / x
print(result)
#
# [-3. -3. -3.]

위에서 *를 통해 수행한 것은 요소별 곱입니다. Numpy에서 벡터와 행렬곱 또는 행렬곱을 위해서는 dot()을 사용해야 합니다.

mat1 = np.array([[1,2],[3,4]])
mat2 = np.array([[5,6],[7,8]])
mat3 = np.dot(mat1, mat2)
print(mat3)
#
# [[19 22]
#  [43 50]]

맷플롯립(Matplotlib)

맷플롯립(Matplotlib)은 데이터를 차트(chart)나 플롯(plot)으로 시각화하는 패키지입니다. 데이터 분석에서 Matplotlib은 데이터 분석 이전에 데이터 이해를 위한 시각화나, 데이터 분석 후에 결과를 시각화하기 위해서 사용됩니다. 아나콘다를 설치하지 않았다면 아래의 커맨드로 Matplotlib를 별도 설치할 수 있습니다.

pip install matplotlib
ipython
...
import matplotlib as mpl
mpl.__version__
# Out[2]: '2.2.3'

Matplotlib을 다 설치하였다면 Matplotlib의 주요 모듈인 pyplot를 관례상 plt라는 명칭으로 임포트해봅시다.

import matplotlib.pyplot as plt

라인 플롯 그리기

plot()은 라인 플롯을 그리는 기능을 수행합니다. plot()에 x축과 y축의 값을 기재하고 그림을 표시하는 show()를 통해서 시각화해봅시다. 그래프에는 title('제목')을 사용하여 제목을 지정할 수 있습니다. 여기서는 그래프에 'test'라는 제목을 넣어봅시다. 주피터 노트북에서는 show()를 사용하지 않더라도 그래프가 자동으로 렌더링 되므로 그래프가 시각화가 되지만 다른 개발 환경에서 사용할 때를 가정하여 show()를 코드에 삽입하였습니다.

plt.title('test')
plt.plot([1,2,3,4],[2,4,8,6])
plt.show()
test
축 레이블 삽입하기

x축과 y축 각각에 축이름을 삽입하고 싶다면 xlabel('넣고 싶은 축이름')ylabel('넣고 싶은 축이름')을 사용합니다. 위의 그래프에 hours와 score라는 축이름을 각각 추가해봅시다.

plt.title('test')
plt.plot([1,2,3,4],[2,4,8,6])
plt.xlabel('hours')
plt.ylabel('score')
plt.show()
test
라인 추가와 범례 삽입하기

다수의 plot()을 하나의 그래프에 나타낼 수 있습니다. 여러개의 라인 플롯을 동시에 사용할 경우에는 각 선이 어떤 데이터를 나타내는지를 보여주기 위해 범례(legend)를 사용할 수 있습니다.

plt.title('students')
plt.plot([1,2,3,4],[2,4,8,6])
plt.plot([1.5,2.5,3.5,4.5],[3,5,8,10]) # 라인 새로 추가
plt.xlabel('hours')
plt.ylabel('score')
plt.legend(['A student', 'B student']) # 범례 삽입
plt.show()
students
matplotlib3
matplotlib3

좀 더 다양한 형태의 그래프를 그리는 실습은 딥 러닝 챕터의 인공 신경망 훑어보기 실습에서 확인할 수 있습니다.


이찬희 (MarkiiimarK)
Never Stop Learning.