PYTHON

Numpy

R.U.s.t.y 2021. 6. 24. 16:43

# 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.]])