Networks/데이터 분석 및 AI

SK networks AI Camp - Numpy 기초

코딩하는 Español되기 2024. 8. 20. 18:00

Numpy

: C언어로 구현된 Python 라이브러리, 벡터 및 행렬 연산에 있어 매우 편리한 기능을 제고

○ numpy.ndarray

    ● ndarray.ndim : Array 요소의 총 개수(= shape 요소의 곱)

    ● ndarray.shape : Array 크기를 나타내는 정수 튜플(행/열수)

    ● ndarray.size : Array 차원

    ● ndarray.dtype : Array 요소 데이터 타입

○ Numpy array vs Python list

    ● array : 모든 요소가 동질적이어야 함, list보다 빠르고 메모리를 적게 사용(코드 최적화 가능)

    ● list : 단일 목록 내에 다양한 데이터 유형 포함 가능

 

○ Numpy install

# CONDA
conda install numpy

# PIP
pip install numpy

 

Vector, Matrix

○ Vector

    ● 1차원 배열, Scalar가 연속적으로 여러 개 모여 있는 것

        * Scalar : 단순하게 측정한 하나의 값

import numpy as np

lst = [1,2,3,4,5]
vector = np.array(lst)

○ Matrix

    ● 2차원 데이터, 1차원 데이터가 여러 개 모여 있는 것

import numpy as np

lst = [
  [1,2,3],
  [4,5,6]
]
matrix = np.array(lst)

 

Numpy 기초

import numpy as np

lst = [1,4,5,6]

vector = np.array(lst)
vector

○ Python list를 이용한 배열

# python list를 이용한 배열
lst2 = [
    [1,2,3],
    [4,5,6]
]

arr2 = np.array(lst2)
arr2

arr2.size # 스칼라 전체 수
arr2.ndim # 차원
arr2.shape # 차원 모양(벡터 수, 스칼라 수)
arr2[1,2] # 스칼라 조회

lst3 = [
   [
      [1,2,3],
      [4,5,6]
  ],
  [
      [1,2,3],
      [4,5,6]
  ],
  [
      [1,2,3],
      [4,5,6]
  ],
  [
      [1,2,3],
      [4,5,6]
  ]
]

arr3 = np.array(lst3)
arr3

arr3.size # 요소 총 개수(Scalar)

arr3.ndim # 차원 수(가로, Scalar 수)

arr3.shape # 차원 모양(Matrix 수(배열 갯수), Vector 수(배열에서 세로), Scalar 수(가로))

 

○ 특수한 배열 생성

    ● np.arrange(10) : 0부터 10개의 스칼라가 들어간 배열

    ● np.arrange(I, J) : 시작이 I부터 J까지(J 포함 안됨)

    ● np.zeros((I, J)) : I * J의 0 행렬 생성 I: 세로 수, J:가로 수

    ● np.ones((I, J)) : I * J의 1 행렬(유닛행렬) 생성

    ● np.full((I, J), K) : I * J의 Scalar가 K인 행렬 생성

    ● np.eye(I) : 단위행렬 생성

 

○ 배열 결합

    ● np.vstack((arr1, arr2)) : arr1부터 arr2까지 세로로 합침

arr1 = np.array([[1,1], [2,2]])
arr2 = np.array([[3,3], [4,4]])

arrv = np.vstack((arr1, arr2))
arrv

    ● np.hstack((arr1, arr2))

       : arr1의 첫 번째와 arr2의 첫 번째 요소를 하나의 행(가로)으로 합치고 두 번째 요소들을 다음 열(세로)에 넣고 합침

 

○ 데이터 타입

    ● arr.astype(np.float32) : Scalar를 실수형으로 변환

    ● np.int8(arr) : Scalar를 int8형태로 변환

    ● np.array([1,2,3], dtype=np.bool_) : boolean 타입으로 변환

 

○ 슬라이싱/인덱싱

    ● 슬라이싱의 경우 파이썬에서 진행한 내용과 동일함

lst = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
arr = np.array(lst)
arr.shape

    ● arr [0, :] = [11,12,13] : arr 인덱스가 0인 배열의 요소가 11, 12, 13으로 바뀜

    ● arr [0, :] = [1,2,3]  arr [:,0]: arr의 인덱스가 0인 배열을 다시 바꾸고 배열의 0번째 Scalar를 반환

    ● arr [: , ::-1] : arr의 모든 요소를 -1부터 반환(반대로 출력)

    ● arr [::2, :] : arr의 처음 배열부터 2씩 증가하여(0번, 2번 배열만) 출력

 

○ 배열 조건 연산

arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
arr

    ● arr [arr <5] : arr에서 5보다 작은 Scalar를 출력

    ● cond = (arr >= 5) arr [cond] : arr에서 5보다 크거나 같은 Scalar만 출력

    ● np.any(arry > 10) : 조건에 참이 하나라도 있으면 True

    ● np.all(arr >= 1) : 조건이 모두 참이면 True

    ● np.where(arr>5, I, J) : 5보다 크면(참) I 반환, 작으면(거짓) J 반환

○ np.clip(array, min, max)

    ● 배열 요소가 min보다 작으면 min으로 반환, max보다 크면 max 반환

    ● np.inf : 무한    / np.nan : 결측치

arr = np.array([np.inf, np.nan, 3,4,5,np.nan, 6, 7])
arr

    ● np.isinf(arr) : inf값인 것을 찾기

    ● np.isnan(arr) : nan 값인 것을 찾기

○ 마스킹

lst = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
arr = np.array(lst)
arr.shape

    ● mask = [True, False, True] : 1, 3번째의 값만 뽑기

mask = [True, False, True]
arr[: , mask]

 

○ Broadcasting

    ● 배열의 모양이 달라도 조건을 만족했을 때 작은 배열을 자동으로 큰 배열 크기에 맞춤

    ● 이 코드에서는 각 인덱스에 맞게 arr1과 arr2가 더해짐

arr1 = np.array([
          [ 0.0,  0.0,  0.0],
          [10.0, 10.0, 10.0],
          [20.0, 20.0, 20.0],
          [30.0, 30.0, 30.0]
        ])
arr2 = np.array([1.0, 2.0, 3.0])
arr1 + arr2

 

    ● 아래 코드는 arr2의 크기가 더 커서 오류가 발생

arr1 = np.array([
          [ 0.0,  0.0,  0.0],
          [10.0, 10.0, 10.0],
          [20.0, 20.0, 20.0],
          [30.0, 30.0, 30.0]
        ])
arr2 = np.array([1.0, 2.0, 3.0, 4.0])
arr1 + arr2

 

    ● 크기가 다른 경우 아래와 같이 조정해 주면 병합이 가능

arr1 = np.array([0.0, 10.0, 20.0, 30.0])
arr2 = np.array([1.0, 2.0, 3.0])
arr1[:, np.newaxis] + arr2