>NumPy<
파이썬은 numpy의 정말 많은 기능들을 사용할 수 있다.
numpy를 사용하기 위해서는 pip로 numpy를 설치 해 주어야 한다.
콘다를 사용하는 사람이라면 따로 설치할 필요가 없으나 콘다 터미널 창에서 conda list | grep numpy로 확인하는 것이 좋다.
- ndarray
numpy로 array를 만드는 방법에는 argane(), array([])가 있다.
numpy.ndarray는 모든 요소들의 타입이 동일해야 한다.
아래 코드에서 c를 보면 문자열 '4'로 인해 모든 요소들이 문자열로 바뀌었다.
문자열을 숫자로 바꾸진 못해도 숫자는 문자열로 바꿀 수 있기 때문이다.
>>> import numpy as np
>>> a = np.arange(3)
>>> a
[0 1 2]
>>> b = np.array([0,1,2])
>>> b
[0 1 2]
>>> c = np.array([0,1,2,3,'4'])
>>> c
['0','1','2','3','4']
- 특수행렬
numpy는 단위행렬, 0 행렬, 1 행렬 등과 같은 특수 행렬을 함수로 제공하고 있다.
>>> import numpy
>>> np.eye(3) #단위행렬
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
>>> np.zeros([2,3]) #0 행렬
array([[0., 0., 0.],
[0., 0., 0.]])
>>> np.ones([3,3]) #1 행렬
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
전치행렬도 ndarray로 가능하다.
>>> improt numpy as np
>>> a = A = np.arange(24).reshape(2,3,4)
>>> a
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> a.T
[[[ 0 12]
[ 4 16]
[ 8 20]]
[[ 1 13]
[ 5 17]
[ 9 21]]
[[ 2 14]
[ 6 18]
[10 22]]
[[ 3 15]
[ 7 19]
[11 23]]]
#np.transpose는 행렬의 축을 어떻게 변환할지 정해줌.
#a 행렬의 3,2,1번째 축을 자신의 1,2,3번째 축으로 바꿈
>>> b = np.transpose(a, (2,1,0))
>>> b
[[[ 0 12]
[ 4 16]
[ 8 20]]
[[ 1 13]
[ 5 17]
[ 9 21]]
[[ 2 14]
[ 6 18]
[10 22]]
[[ 3 15]
[ 7 19]
[11 23]]] #a.T와 같은 결과가 나오는 것을 알 수 있음.
- 브로드캐스트
numpy에서 가장 유용(?하다고 생각되는 기능인 브로드캐스트는 ndarray와 상수끼리 산술연산이 가능하며 서로 크기가 다른 ndarray끼리도 산술연산이 가능하다.
>>> import numpy as np
>>> a = np.arange(6).reshape(3,2)
>>> a
array([[0, 1],
[2, 3],
[4, 5]])
#ndarray와 상수의 연산
>>> a*2
array([[0, 2],
[4, 6],
[8, 10]])
#크기가 다른 ndarray끼리의 연산
>>> a = np.arange(9).reshape(3,3)
>>> a
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> b = np.array([1, 2, 3])
>>> b
[1 2 3]
>>> a+b
array([[ 1, 3, 5],
[ 4, 6, 8],
[ 7, 9, 11]])
크기가 다른 두 행렬이 무조건 연산이 되는 것은 아니다.
수학에서의 행렬끼리의 계산과 마찬가지로 3x3 행렬과 1x2행렬의 연산은 당연히 되지 않는다.
- random
numpy에서는 난수를 지원한다. 정말 많이 쓰는 기능인데,
np.random으로 사용할 수 있으며 random 패키지 안에는 또 다양한 기능이 많이 내장되어 있다.
import numpy as np
# 0~1 사이의 실수형 난수 하나를 생성함.
print(np.random.random())
>>> 0.8051337418405335
# 0~9 사이에서 1개의 정수형 난수 하나를 생성함.
print(np.random.randint(0,10))
>>> 8
# 리스트에 주어진 값 중 하나를 랜덤하게 골라줌.
print(np.random.choice([0,1,2,3,4,5,6,7,8,9]))
>>> 4
- 통계 관련 수식
numpy를 사용하여 평균값, 표준편차값, 중앙값을 계산할 수 있다.
평균값 : np.mean()
표준편차값 : np.std()
중앙값 : np.dedian()
- 이미지를 array로 표현
파이썬에서는 numpy를 사용하여 이미지를 2d 또는 3d rray로 표현할 수 있다.
이미지 파일을 불러오는 방법은 pillow, opencv가 있지만 이 둘의 내용은 후에 따로 포스팅 할 예정이므로 여기선 이미지를 불러온 후의 내용만 다룰 예정이다.
위의 코드 및 결과는 pillow 모듈을 사용하여 이미지를 불러온 후 np.array를 이용하여 이미지를 ndarray로 바꾼 결과이다. 이미지가 ndarray로 잘 변환 된 것을 알 수 있다.
파이썬에서는 데이터를 array로 나타내는 방법 말고도 table로 나타내는 방법도 있다.
데이터 내부에 자체적인 서브 구조를 가진 데이터를 구조화 된 데이터라고 하는데, 이는 딕셔너리 형태로 나타낼 수 있다. 키와 값을 가지는 딕셔너리 데이터로 표현하기는 좋긴 하나 매우 제한적이다.
이러한 종류의 데이터들은 table로 나타내는 것이 보기에도 편한데, 이 때 pandas를 사용하면 좋다.
>Pandas<
파이썬 라이브러리인 pandas는 Series와 DataFrame이라는 자료 구조를 제공한다.
pandas는 numpy 기반에서 개발되었다.
축의 이름에 따라 데이터를 정렬할 수 있으며 데이터를 인덱스하여 다룰 수도 있다.
또, 누락된 데이터를 처리할 수 있으며 데이터를 합치고 관계연산을 수행할 수도 있다.
pandas 역시 pip install pandas를 입력하여 모듈을 설치 해야 사용할 수 있다.
- Series
Series는 객체를 담을 수 있는 1d array와 비슷한 자료구조이다.
리스트, 튜플을 통해 만들 수 있으며 numpy 자료형으로도 만들 수 있다.
Seires는 index와 value가 있다. 이는 Series가 배열과 매우 비슷함을 알 수 있다.
>>> import pandas as pd
>>> a = pd.Series(['a','1','b','2'], index=['c','d','e','f'])
>>> a
c a
d 1
e b
f 2
dtype : object
>>> a.index
Index(['c','d','e','f'], dtype='objct')
>>> a.values
array(['a','1','b','2'], dtype = object)
또, Series 객체의 name 속성을 이용해 Series 객체의 이름을 설정하고 Series Index의 name 속성을 이용해 인덱스 이름을 설정할 수 있다. 이는 pandas의 DataFrame에서 매우 중요하다.
- DataFrame
데이터프레임은 table과 같은 자료 구조이다.
여러 개의 칼럼을 나타낼 수 있기에 csv 파일이나 excel 파일을 데이터프레임으로 변환을 많이 한다.
위의 그림과 같이 pd.DataFrame을 해주면 데이터를 table로 깔끔하게 나타낼 수 있다.
>Matplotlib<
데이터를 시각화 하는 것 또한 중요하다. 파이썬에서는 pandas, matplotlib, seaborn 등으로 데이터를 시각화 할 수 있다.
나는 학부 4년 + 인턴 4개월까지 데이터를 다루면서 시각화는 matplotlib로만 해왔기에... 나는 matplotlib를 이용하여 데이터 시각화 하는 것에 익숙하기에 matplotlib에 대해서만 아주 아주 간략하게 정리해 둔다.
matplotlib 모듈을 사용하면 여러가지 그래프를 그릴 수 있으며 이미지 또한 나타낼 수 있다.
matplotlib의 그래프 그리는 과정은 다음과 같다.
1. fig = plt.figure()
2. ax1 = fig.add_subplot(1,1,1)
3. ax1.bar(x, y)
4. plt의 여러 메소드 grid, xlabel, ylabel 을 이용해서 추가
5. 나타내고 싶은 그래프로 plt.show()
- plt.bar()
- plt.plot()
plt.plot()에는 많은 옵션들이 있다.
line의 모양을 바꿀 수 있으며 line의 색도 지정할 수 있다.