[Numpy] Numpy
Numpy#
Python의 Numpy는 Vector와 Matrix연산에 있어서 상당한 편의성을 제공하는 모듈로 Machine Learning과 Deep Learning의 기본 Module이다.
ndarray#
Numpy는 새로운 Data Type을 이용한다.
기존 Python의 대표적인 Data Type
- list
- tuple
- range
- dict
- set
Ndarray
의 특징
- python의 list와 상당히 유사하게 생겼어요!
- python의 list는 각기 다른 데이터 타입을 저장할 수 있어요! ex) a = [1, True, ‘Hello’, 3.14]
- ndarray는 동일한 데이터 타입만 사용할 수 있어요!
- list와 상당히 유사하지만 수학적 계산 속도면에서 비교가 불가능할 정도로 ndarray가 빠르고 효율적이예요
import numpy as np
a = [1, 2, 3, 4]
print(type(a)) # <class 'list'>
print(a) # []를 사용하고 원소의 구분을 ,로 해요! [1, 2, 3, 4]
print(type(a[0])) # <class 'int'>
b = np.array([1, 2, 3, 4]) # ndarray를 만들어내는 가장 대표적인 방법.
print(type(b)) # <class 'numpy.ndarray'>
print(b) # [1 2 3 4] list와 유사하지만 요소의 구분을 space로 해요!
print(type(b[0])) # <class 'numpy.int32'>
c = np.array([1, 2, 3.14, 4]) #
print(c) # [1. 2. 3.14 4. ]
print(type(c[0])) # <class 'numpy.float64'>
d = np.array([1, 2, 3.14, 4], dtype=np.int32) #
print(d) # [1 2 3 4 ]
print(type(d[0])) # <class 'numpy.int32'>
중첩리스트와 ndarray의 속성#
a = [[1, 2, 3], [4, 5, 6]] # 중첩리스트 => 2차원이라고 부르지는 않아요!
b = np.array(a, dtype=np.float64)
print(b) # [[1. 2. 3.]
# [4. 5. 6.]]
print(b[1,1]) # 5.0
# ndarray의 속성 몇가지만 알아보아요!
print(b.dtype) # 기본적인 numpy라는 것을 알고 있기에 실제 type인 float64가 출력됨
print(b.ndim) # 2 (차원의 수), ndim은 그다지 많이 사용되지 않아요!
print(b.shape) # 이 array의 형태를 tuple로 출력되고 tuple의 요소수가 차원의 개수이기에 ndim보다 많이 사용한다.
a = [1, 2, 3, 4, 5]
print(np.array(a).shape) # (5,)
a = [[[1,2],[3,4]], [[5,6],[7,8]]]
print(np.array(a)) # [[[1 2]
# [3 4]]
# [[5 6]
# [7 8]]]
print(np.array(a).shape) # (2, 2, 2)
a = [1, 2, 3, 4] # list
arr = np.array(a) # int32형태의 ndarray(vector)가 생성
print(arr) # [1 2 3 4]
print(arr.shape) # (4,)
arr.shape = (2, 2)
print(arr) # [[1 2]
# [3 4]]
arr.shape = (4, 1, 1)
print(arr)
print(arr.size) # 4 size는 요소의 개수를 알려줘요!
data type을 바꾸려면 어떻게 해야 하나요?#
# data type을 바꾸려면 어떻게 해야 하나요?
a = [1, 2, 3, 4, 5, 6]
arr = np.array(a, dtype=np.float64)
print(arr)
# int32형태의 ndarray로 변경하고 싶으면?? => astype()
result = arr.astype(np.int32)
print(result)
ndarray를 만드는 또 다른 방법#
arr = np.zeros((2,3,3)) # default data type은 np.float64
print(arr)
# [[[0. 0. 0.]
# [0. 0. 0.]
# [0. 0. 0.]]
#
# [[0. 0. 0.]
# [0. 0. 0.]
# [0. 0. 0.]]]
arr = np.ones((2,3))
print(arr)
# [[1. 1. 1.]
# [1. 1. 1.]]
arr = np.empty((5,6)) # 임의의 메모리 값이 들어가게됨
print(arr)
# [[6.23042070e-307 4.67296746e-307 1.69121096e-306 1.33511018e-306
# 7.56587585e-307 1.37961302e-306]
# ...
arr = np.full((3,4), 9.)
print(arr)
# [[9. 9. 9. 9.]
# [9. 9. 9. 9.]
# [9. 9. 9. 9.]]
arr = np.array([[1,2,3],[4,5,6]], dtype=np.float64)
print(arr)
# [[1. 2. 3.]
# [4. 5. 6.]]
result = np.zeros_like(arr) # arr의 shape를 따와서 적용한다 즉 위의 함수들에 _like를 붙이게 되면 이와 같이 동작하게 된다.
print(result)
# [[0. 0. 0.]
# [0. 0. 0.]]
# python의 range와 흡사함, 단, range와 다른 점은 range와 다르게 실제로 값을 가지고 있다
arr = np.arange(0,10,2)
print(arr)
import matplotlib.pyplot as plt
# np.linspace(start,stop,num)
# start에서 stop까지 범위에서 num개를 균일한 간격으로 원소를 생성하고 배열을 만들어요!
arr = np.linspace(0,10,11)
print(arr)
# 이해하기가 힘들어서 그래프로 그려보아요!
# 그래프를 그리려면 당연히 module을 설치해야 해요! 가장 기반이 되는 module은 matplotlib
# conda install matplotlib
plt.plot(arr, '*')
plt.show() # 출력 결과 01