[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의 특징

  1. python의 list와 상당히 유사하게 생겼어요!
  2. python의 list는 각기 다른 데이터 타입을 저장할 수 있어요! ex) a = [1, True, ‘Hello’, 3.14]
  3. ndarray는 동일한 데이터 타입만 사용할 수 있어요!
  4. 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

출력 결과 01

img