Numpy
# Numpy
파이썬으로 백터나 행렬을 나타내기 위해서 numpy 라이브러리를 사용한다.
파이썬 기반의 데이터 분석, 데이터 과학 등에 많이 사용된다.
(캡슐화되어 함수로 구현 되어 있음)
# 데이터 유형
1) 스칼라(scalar) : 하나의 숫자로 이루어진 데이터
2) 벡터(Vector) : 여러 숫자로 이루어진 데이터 레코드(data record)
3) 행렬(matrix) : 벡터, 즉 데이터레코드가 여럿인 데이터 집합
4) 텐서(Tensor): 같은 크기의 행렬이 여럿인 집합
x = np.array(10)
type(x)
numpy.ndarray
print('스칼라 x의 값 : {}'.format(x))
print('스칼라 x의 타입 : {}'.format(type(x)))
스칼라 x의 값 : 10
스칼라 x의 타입 : <class 'numpy.ndarray'>
print(x.shape)
()
print(x.ndim) # 0차원 이라고 한다.
0
x = np.arange(0,10,2)
print('벡터 x의 값 : {}'.format(x))
print('벡터 x의 타입 : {}'.format(type(x)))
print('벡터 x의 크기 : {}'.format(x.shape))
print('벡터 x의 차원 : {}'.format(x.ndim))
벡터 x의 값 : [0 2 4 6 8]
벡터 x의 타입 : <class 'numpy.ndarray'>
벡터 x의 크기 : (5,)
벡터 x의 차원 : 1
x = np.array(1)
y = np.array([1,2])
z = np.array([[5,1],[3,5],[0,2]])
a = np.array([[[5,0],[6,5],[1,2]], [[5,1],[3,5],[0,2]]])
print('Scala - 0 차원 : ',x.ndim)
print('Vector - 1 차원 : ',y.ndim)
print('Matrix - 2 차원 : ',z.ndim)
print('Tensor - 3 차원 : ',a.ndim)
Scala - 0 차원 : 0
Vector - 1 차원 : 1
Matrix - 2 차원 : 2
Tensor - 3 차원 : 3
# 차원 임의로 변경
import numpy as np
arr = np.array([1,2,3,4], ndmin=5)
print(arr)
print(arr.ndim,'차원')
[[[[[1 2 3 4]]]]]
5 차원
# 파이썬 리스트 복습
#### 한번 해보기) 다음과 같은 2차원 데이터를 자유롭게 생성하는 클래스를 정의하고
#### 출력 하시오.
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
# 인덱스 출력
3 => 3
10 => 10
class TndArray():
import numpy as np
res = []
def makeNdArray(self,s,e):
self.res.append([x for x in range(s,e)])
def getNdArray(self):
return np.array(self.res)
ref = TndArray()
ref.makeNdArray(1,6)
ref.makeNdArray(6,11)
t = ref.getNdArray()
print('3 => ',t[0][2])
print('10 => ',t[1][-1])
# Numpy 데이터 타입 astype, dtype, np.array(,dtype=np.numpytType)
# 요소가 0 인 ndarray 만들기
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
# 모든 요소가 0인 N차원의 영백터(zero-vector). 1벡터
np.zeros((3,3))
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
np.ones((3,3))
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
# 대각선 으로 1 채워주는 행렬 (정방행렬 : Square Matrix)
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
# 1의 위치 한칸씩 조정, 데이타타입 지정
np.eye(5,k=-1,dtype='float')
array([[0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.]])
# 특정 줄, 특정위치에 1 배치
np.eye(7)[np.array([1,2,3,4,5,6])]
array([[0., 1., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 1.]])
# 대각행렬
np.diag([x for x in range(1,6)])
array([[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[0, 0, 0, 0, 5]])
# 항등행렬
# 모든 대각성분의 값이 1인 대각행렬
np.identity(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
# 원하는 숫자로 행렬을 채우는 함수
np.full((6,6),255)
array([[255, 255, 255, 255, 255, 255],
[255, 255, 255, 255, 255, 255],
[255, 255, 255, 255, 255, 255],
[255, 255, 255, 255, 255, 255],
[255, 255, 255, 255, 255, 255],
[255, 255, 255, 255, 255, 255]])
# 전치행렬
- 행렬의 행과 열을 바꾸는 연산
- 벡터나 행렬에 T 라는 위첨자(super-script)를 붙여서 표기
- 행렬 A가 m x n 행렬이면 AT로 표시되는 A의 전치행렬(transpose)은
n x m 행렬이고 A의 행과 열을 바꾼 행렬이다.
- 가중치 값 계산, 유사도를 구할 때, 즉 벡터의 내적을 구할 때 사용된다.
x = np.array([[11,12,13],[21,22,23]])
x.shape
(2, 3)
x1 = x.T
x1.shape
(3, 2)
np.transpose(x)
array([[11, 21],
[12, 22],
[13, 23]])
np.transpose(x1)
array([[11, 12, 13],
[21, 22, 23]])
#### one-hot 인코딩 (분류형에 적용 한다.)
일반적으로 머신 러닝에서 분류를위한
one-hot 인코딩을 원할 경우를 사용하지만,
이러한 표현 방식은 단어의 개수가 늘어날 수록,
벡터를 저장하기 위해 필요한 공간이 계속 늘어난다는 단점
단어의 유사도를 표현하지 못한다는 단점
import numpy as np
a = np.array([0,1,2,2,2,1,0,0,1])
b = np.max(a) + 1
np.eye(b)[a]
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 0., 1.],
[0., 0., 1.],
[0., 1., 0.],
[1., 0., 0.],
[1., 0., 0.],
[0., 1., 0.]])