머신러닝
[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']