-
[ML-1] 파이썬 _ 넘파이(Numpy) 패키지머신러닝 2022. 1. 10. 16:45
- 넘파이(Numpy) 패키지 : 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 패키지
1. Numpy 모듈 임포트
import numpy as np
- import numpy도 괜찮지만, 편의를 위해서 as np를 추가해 약어로 묘듈을 표현하는 것이 관례.
2. ndarray
#array() : 파이썬의 리스트와 같은 다양한 인자를 입력 받아서 ndarray(Numpy 기반 데이터 타입)로 변환하는 기능 array1=np.array([1,2,3]) array2=np.array([[1,2,3],[2,3,4]]) array3=np.array([[1,2,3]])
print('array1 array shape:',array1.shape) #shape변수는 ndarray의 크기 / (행,열) 튜플 형태 print('array2 array shape:',array2.shape) print('array3 array shape:',array3.shape) [결과] array1 array shape: (3,) array2 array shape: (2,3) array3 array shape: (1,3) """ array1과 array3의 차이를 분명하게 이해해야함. 동일한 데이터 건수를 가지고 있지만 array1은 1차원, array3은 2차원 데이터임을 .shape를 통해 알 수 있음 """
- ndarray의 데이터 값은 모든 숫자, 문자열, boolean 모두 가능함.
(단, ndarray내의 데이터 타입은 같은 데이터 타입만 가능함. 한개의 ndarray 객체 내에 int / float이 함께 있을 수 없음)
array=np.array([1,2,3.0]) #[int,int,float] print(array,array.dtype) [결과] [1. 2. 3.] float64 """ 이처럼 ndarray는 데이터 값이 모두 같은 타입이어야 하므로 서로 다른 데이터 타입이 섞여 있을 경우 데이터 타입이 더 큰 데이터 타입으로 변환됨 """
- astype() 메서드를 활용한다면 ndarray 내 데이터 값의 타입 변경이 가능함.
(메모리 절약 가능)
array_int=np.array([1,2,3]) array_float=array_int.astype('float') #int타입의 데이터 값을 float타입으로 변경 print(array_float,array_float.dtype) [결과] [1. 2. 3.] float64
- reshape() 메서드는 ndarray의 차원과 크기를 변경함.
array1=np.array([1,2,3,4,5,6,7,8,9]) print('array1:\n',array1) array2=array1.reshape(3,3) #1차원 ndarray를 3x3 형태로 변경 print('array2:\n',array2) [결과] array1: [1 2 3 4 5 6 7 8 9] array2: [[1 2 3] [4 5 6] [7 8 9]] """ 지정된 사이즈로 변경이 불가능할 경우, 오류 발생 """ array1=np.array([1,2,3,4,5,6,7,8,9]) print('array1:\n',array1) array2=array1.reshape(4,2) # 4x2 형태로는 변경이 불가능함 print('array2:\n',array2) [결과] array1: [1 2 3 4 5 6 7 8 9] Traceback (most recent call last): File " ", line 5, in <module> array2=array1.reshape(4,2) ValueError: cannot reshape array of size 9 into shape (4,2)
3. ndarray의 데이터 세트 _ 인덱싱(Indexing)
- 단일 값 추출
array1=np.array([1,2,3,4,5,6,7,8,9]) print('array1:\n',array1) print('3번째 데이터 값 출력:',array1[2]) # ndarray[원하는 위치의 index 값] [결과] array1: [1 2 3 4 5 6 7 8 9] 3번째 데이터 값 출력: 3 """ 단일 index를 활용한다면 ndarray 내의 데이터 값도 수정 가능 """ array1[0]=13 print('array1:\n',array1) [결과] array1: [13 2 3 4 5 6 7 8 9] # 0번째 index 데이터 값이 1 -> 13으로 변경 """ 다차원 ndarray도 같은 방식으로 활용하면 됨 (ex. 2차원 ndarray) """ array1=np.array([[1,2,3],[4,5,6],[7,8,9]]) print('array1:\n',array1) print('row=1, col=2:',array1[1,2]) # 2번째 행의 3번째 열 값 출력 [결과] array1: [[1 2 3] [4 5 6] [7 8 9]] row=1, col=2: 6 """ 원래 ndarray에서는 row, col로 표현하지 않음 axis0=row axis1=col 이라고 생각하면 됨 다차원 ndarray는 axis 구분을 가짐 (만약 3차원 ndarray라면, axis0,axis1,axis2 3개의 축을 가짐(행,열,높이) """
- 연속 데이터 추출 : ':' 기호(슬라이싱)를 이용하여 연속한 데이터를 추출
array1=np.array([1,2,3,4,5,6,7,8,9]) print(array1[0:3])# [시작index:종료index+1] [결과] [1 2 3] """ 생략도 가능함 """ print(array1[:3]) # 0~2 print(array1[3:]) # 3~8 print(array1[:]) # 0~8 [결과] [1 2 3] [4 5 6 7 8 9] [1 2 3 4 5 6 7 8 9] """ 다차원 ndarray의 경우 ','를 통해 row(axis0),col(axis1)을 지칭해줌 """ array1=np.array([[1,2,3],[4,5,6],[7,8,9]]) print('[0:2,0:2]:\n',array1[0:2,0:2]) # row0~1/col0~1 print('[:2,1:]:\n',array1[:2,1:]) # row0~1/col1~2 [결과] [0:2,0:2]: [[1 2] [4 5]] [:2,1:]: [[2 3] [5 6]]
- 불린 인덱싱(Boolean Indexing) : 조건 필터링과 검색을 동시에 할 수 있음
array1=np.array([1,2,3,4,5,6,7,8,9]) print(array1[array1>3]) # ndarray[조건] / '[]'내에 조건만 기재해주면 됨 [결과] [4 5 6 7 8 9]
4. 행렬의 정렬
- np.sort() / ndarray.sort()
방식1 org_array=np.array([4,2,7,9,1]) print('original:',org_array) sort_array=np.sort(org_array) # np.sort()는 원 행렬은 유지, 정렬한 행렬을 반환 org_array.sort() # nparray.sort()는 원 행렬 자체를 정렬한 형태로 변환 print('sort(by np.sort()):',sort_array) print('sort(by ndarry.sort()):',org_array) [결과] original: [4 2 7 9 1] sort(by np.sort()): [1 2 4 7 9] # sort()의 디폴트는 '오름차순' sort(by ndarry.sort()): [1 2 4 7 9] """ 내림차순으로 정렬하고 싶다면 .sort()[::-1] 형태로 사용하면 됨 """ org_array=np.array([4,2,7,9,1]) print('original:',org_array) sort_array=np.sort(org_array)[::-1] print('sort:',sort_array) [결과] original: [4 2 7 9 1] sort: [9 7 4 2 1] # 내림차순
5. 정렬된 행렬의 인덱스
- argsort() : Numpy에서 활용도가 굉장히 높음
org_array=np.array([4,2,7,9,1]) sort_index=np.argsort(org_array) # [4,2,7,9,1]->[1,2,4,7,9] print(sort_index) [결과] [4 1 0 2 3] # 오름차순 정렬 후 index
argsort() 메서드는 각각의 데이터를 별도의 ndarray로 가져야만 사용할 수 있음
""" 학생의 이름을 저장한 ndarray와 해당 학생의 점수를 저장한 ndarray가 있다고 가정 성적순으로 학생의 이름을 출력해보자 """ name_array=np.array(['Kim','Park','Lee','Jeong','Yoon']) score_array=np.array([88,67,97,100,84]) # 데이터는 따로 각각의 ndarray에 속해야 함 sort_by_score=np.argsort(score_array) # 정렬된 데이터의 index 저장 print('성적 순서대로 학생 이름 출력(오름차순):\n',name_array[sort_by_score]) [결과] 성적 순서대로 학생 이름 출력(오름차순): ['Park' 'Yoon' 'Kim' 'Lee' 'Jeong']
'머신러닝' 카테고리의 다른 글
[ML-2] 파이썬 _ 판다스(Pandas) 패키지 (0) 2022.01.11 [ML-0] 머신러닝이란 (0) 2022.01.10