파이썬 머신러닝 완벽가이드

넘파이 (ndarray)

threegopark 2021. 5. 10. 14:23
728x90
  • 머신러닝의 주요 알고리즘 --> 선형대수 & 통계 등에 기반
  • NumPy (numerical python) : 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 패키지
  • 방대한 계산 능력, 빠른 계산
  • C/C++ 저수준 언어 기반의 호환 API 제공
  • 데이터 핸들링 기능 제공
  • 다차원 배열 생성 및 연산 수행 가능

 

import numpy as np


array1 = np.array([1,2,3])
#1차원 3개 데이터

array2 = np.array([[1,2,3],[2,3,4]])
#2차원, 2*3=6개 데이터

array3 = np.array([[1,2,3]])
#2차원, 3개 데이터

 

ndarray의 데이터 타입

 

  • 숫자, 문자열, bool값 등 모두 가능
  • 숫자형 - int형 (8bit, 16bit, 32bit), unsigned int형(8bit, 16bit, 32bit), float형(8bit, 16bit, 32bit, 128bit), complex형
  • ndarray 내의 데이터 타입은 그 연산의 특성상 같은 데이터 타입만 가능 (한 array 내, int & float 공존불가)
  • 리스트 형식을 ndarray 형식으로 쉽게 변환 가능
list1 = [1,2,3]

array1 = np.array(list1)

  • 만약 서로 다른 데이터 형이 array 내 존재할 경우 더 큰 타입으로 자동 변환 (int 와 float --> float형으로 변환)
  • array 내 데이터 타입 변경
array_int = np.array([1,2,3])
array_float = array_int.astype('float64')
#[1. 2. 3.] float64 생성

array_float = np.array([1.1, 2.1, 3.2])
array_int = array_int.astype('int32')
#[1 2 3] int32 생성

 

 

ndarray의 생성 - arange, zeros, ones

 

  • 주로 테스트용 데이터 생성, 일괄적인 초기화에 사용
  • ones(), zeros(), arange()
  • arange() 함수
sequence_array = np.arange(0,13,3)
print(sequence_array)
print(sequence_array.dtype, sequence_array.shape)

 

  • zeros() 함수
zero_array = np.zeros((3,2), dtype='int32')
print(zero_array)
print(zero_array.dtype, zero_array.shape)

 

  • ones() 함수
one_array = np.ones((3,2))
print(one_array)

 

ndarray의 차원과 크기 변경 - reshape()

 

array1 = np.arange(10)
print('array1:\n', array1)

array2 = array1.reshape(2,5)
print('array2:\n', array2)

array3 = array1.reshape(5,2)
print('array3:\n', array3)

  • reshape() : 지정된 사이즈로 변경이 불가능하면 오류 발생
  • 효율적으로 사용하기 위하여 -1을 인자로 사용 (칼럼 인자에 맞춰서 자동 생성)
array1 = np.arange(10)
array2 = array1.reshape(-1,5)
#고정된 5개의 칼럼, 10/5 = 2, 즉 2개의 row 자동 생성
array3 = array1.reshape(-1,2)
#고정된 2개의 칼럼, 10/2 = 5, 즉 5개의 row 자동 생성

 

  • reshape(-1,1) 의 형태가 자주 사용됨 --> 원본 ndarray가 어떤 형태라도 2차원이고, 여러 개의 row를 가지되 반드시 1개의 칼럼을 가진 ndarray로 변환
  • 이 방식은 stack, concat 결합 시 유용하게 사용됨
array1 = np.arange(8)
array3d = array1.reshape((2,2,2))

array5 = array3d.reshape(-1,1)
array6 = array1.reshape(-1,1)
#tolist() 사용하여 변형하면,

 

 

ndarray의 데이터 세트 선택 - 인덱싱(indexing)

 

  • 특정한 데이터만 추출 : 인덱스를 활용, 해당 위치의 데이터 반환 
array1 = np.arange(1, 10)

#3번째 인덱스 (0부터 시작이므로)
value1 = array1[2] 

#마지막 인덱스
value_end = array1[-1]

  • axis=1 : 가로 축 방향→, axis=0 : 세로 축 방향↓, axis=2 : 높이 축 방향
array1d = np.arange(1,10)
array2d = array1d.reshape(3,3)

print('array2d :\n', array2d)
print('(row=0, column=0) index 값 :' , array2d[0,0])
print('(row=0, column=1) index 값 :' , array2d[0,1])
print('(row=1, column=2) index 값 :' , array2d[1,2])

 

  • 슬라이싱 : 연속된 인덱스상의 ndarray 추출
array1= np.arange(1,10)
array3 = array1[0:3]
array4 = array1[:-1]

 

array_first = np.arange(1,10)
array1 = array_first.reshape(3,3)

array2 = array1[0:2,0:2]
array3 = array1[1:2,1]
array4 = array1[1:3,:]
array5 = array1[:,:]
#[행 범위, 열 범위]

 

  • 팬시 인덱싱 : 일정한 인덱싱 집합을 리스트 or ndarray 형태로 지정, 해당 위치의 데이터 반환
array1 = np.arange(1,10).reshape(3,3)

array2 = array1[[0,1], 2]
#2열의 [0행, 1행]

array3 = array1[[1,2], :2]
#0열, 1열의 [1행, 2행]

array4 = array1[[0,2], :]
#전체 열의 [0행, 2행]

 

  • 불린 인덱싱 : 특정 조건에 해당하는 True/False 값 인덱싱 집합을 기반으로 데이터 반환
array1 = np.arange(10)

array2 = array1[array1 < 3]
#array1 중 3보다 작은 값

 

 

행렬의 정렬 - sort(), agrsort()

 

  • np.sort() , 데이터 자체를 반환
array1 = np.array([3, 1, 5,6,8])

오름차순 정렬
array2 = np.sort(array1)

#내림차순 정렬
array3 = np.sort(array1)[::-1]

 

array1 = np.array([[8,12], [7,1], [6,3]])

#axis = 0 : 행 방향
array2 = np.sort(array1, axis = 0)

 

 

  • np.argsort() , 인덱스 반환
array1 = np.array([1, 0, 9, 5])

array2 = np.argsort(array1)

 

 

선형대수 연산 - 행렬 내적, 전치 행렬

 

array1 = np.array([[1,2,3], [4,5,6]])
#2행 3열

array2 = np.array([[1,3,4],[2,5,1],[5,6,7]])
#3행 3열

dot_prod = np.dot(array1, array2)
#2x3 dot 3x3 --> 2x3

 

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

array2 = np.transpose(array1)