반응형
데이터 조작 (Numpy)
- Numpy 라이브러리
- Numpy란?
- Numpy vs. Python
- 인덱싱과 슬라이싱
- Numpy 연산
- 다차원배열
- Numpy 함수
Numpy란?
- NumPy: Numerical Python
- 데이터 분석(수치 계산, 통계 등)을 위해 만들어진 파이썬 라이브러리
- ex) 선형대수, 푸리에(Fouerier) 변환, 유사 난수 생성 가능 - Numpy의 자료구조는 Pandas 라이브러리, matplotlib(시각화) 라이브러리의 기본 데이터 타입으로 사용
- ex) 배열 생성, 저장, 색인(index) 처리, 벡터 연산 가능 - NumPy는 C언어로 구현된 파이썬 라이브러리로, 메모리를 적게 차지하고 속도가 빠름
- 데이터 분석(수치 계산, 통계 등)을 위해 만들어진 파이썬 라이브러리
Numpy 사용이유
- Python List vs. Numpy
- 파이썬 List의 경우 여러개의 값들을 저장할 수 있는 자료구조로써 다차원의 배열을 표현할 수 있음 (생성, 추가, 제거 가능)
- 파이썬 리스트는 리스트 간의 다양한 연산이 필요하지만 다양한 기능이 부족하고 데이터가 증가할수록 연산 속도가 느림
- NumPy는 대용량 배열과 행렬 연산을 빠르게 수행
- 고차원의 수학 연산자와 함수를 라이브러리 안에 포함 - Numpy의 연산은 왜 빠를까?
- NumPy는 각 배열마다 타입이 하나만 있다고 가정
- 즉 배열 안에 동일한 타입의 데이터만 저장 가능(ex. 정수면 정수, 실수면 실수만)
- 만약 여러 타입의 자료형을 사용하는 경우 NumPy에서는 문자열로 처리 - 동일한 자료형을 사용하는 경우 데이터 항목에 대한 저장공간이 일정해짐
- 즉 일정한 저장공간에서 빠르게 데이터에 접근하는 Random Access가 가능
- (예제) 학생들의 중간고사와 기말고사 성적을 저장하고 있는 리스트가 제시되어 있고 표의 내용처럼 각 학생 별로 중간고사와 기말고사의 총점이라는 리스트를 만들고 싶음
중간고사 성적 기말고사 성적 총점 학생 #1 10 70 80 학생 #2 20 80 100 학생 #3 30 90 120 - 파이썬 리스트 더하기 연산자는 두 리스트를 연결하므로, mid_scores + final_scores을 적용하면 다음과 같이 2개의 리스트를 연결한 리스트가 만들어짐
그러나 위는 우리가 원하는 연산대로 출력된 것이 아님!total = mid_scores + final_scores total ''' 출력 결과 [10 + 20 + 30 + 70 + 80 + 90] '''
- 아래의 예제처럼 표현할 수도 있으나 Iteration으로 1개씩 값을 Open하고 계산하여 저장하는 형태의 구조를 가져야함
mid_scores = [10, 20, 30] final_scores = [70, 80, 90] total = [] for i in range(len(mid_scores)): total.append(mid_scores[i] + final_scores[i]) total ''' 출력 결과 [80, 100, 120] '''
- NumPy를 이용한다면 좀 더 간단한 구조로 연산이 가능
Numpy를 활용한 배열 연산
- NumPy 사용 방법
- Numpy 패키지
import numpy as np
- Numpy의 array() 함수를 이용한 배열 생성
mid_scores = np.array([10, 20, 30]) final_scores = np.array([60, 70, 80])
- Numpy array 객체 연산
total = mid_scores + final_scores print('시험성적의 합게: ', total) #각 요소별 합계 출력 print('시험성적의 평균: ', total/2) #모든 요소를 2로 나눔 ''' 출력 결과 시험성적의 합계: [70, 90, 110] 시험성적의 평균: [35, 45, 55] '''
- Numpy 패키지
- NumPy 연산 기능
- Numpy array에는 +, *와 같은 수학 연산자 적용 가능
- 예를 들어 [220, 250, 230]이라는 배열에서 각 원소에 100씩 더한 값을 구하려면?
import numpy as np salary= np.array([220, 250, 230])
- 단순히 배열에 스칼라 값 100을 더하면 됨!
salary= salary+100 salary ''' 출력 결과 [320, 350, 330] '''
- 곱셈 연산도 가능 (정수, 실수, 모두 가능: 자동 형변환)
salary= np.array([220, 250, 230]) salary= salary*2 salary ''' 출력 결과 [440, 500, 460] '''
- Numpy array에는 +, *와 같은 수학 연산자 적용 가능
- Numpy를 활용한 간단한 연산
- 다음과 같은 연산의 결과를 출력해보자
import numpy as np a= np.array(range(10)) #range(A): 0부터 A-1까지의 정수 반환 b= np.array(range(1, 11)) #range(A, B): A부터 B-1까지의 정수 반환 c= np.array(range(10, 101, 10)) #range(A, B, C): A부터 C 숫자만큼의 간격으로 B-1까지의 정수 반환 a+b+c, a-b-c, a*b*c*, a/b, a/c ''' 출력 결과 (array([ 11, 23, 35, 47, 59, 71, 83, 95, 107, 119]), array([ -11, -21, -31, -41, -51, -61, -71, -81, -91, -101]), array([ 0, 40, 180, 480, 1000, 1800, 2940, 4480, 6480, 9000]), array([0. , 0.5 , 0.66666667, 0.75 , 0.8 , 0.83333333, 0.85714286, 0.875 , 0.88888889, 0.9 ]), array([0. , 0.05 , 0.06666667, 0.075 , 0.08 , 0.08333333, 0.08571429, 0.0875 , 0.08888889, 0.09 ])) '''
- 다음과 같은 연산의 결과를 출력해보자
- Numpy를 활용한 다양한 산술 연산
import numpy as np a= np.array([1, 2.5, 4.0, 5.5, 7.0]) #np.array함수를 사용한 값을 변수 a에 저장 #변수 a의 4번째 자리부터 출력 ''' 출력 결과 array([ 5.5, 7. ]) '''
- 합계, 표준편차, 누적합
import numpy as np a= np.array([1, 2.5, 4.0, 5.5, 7.0]) #1은 자동적으로 형변환 수행 1.0 print("합계", a.sum()) print("표준편차", a.std()) print("누적합", a.cumsum()) ''' 출력 결과 합계 20.0 표준편차 2.1213203435596424 누적합 [ 1. 3.5 7.5 13. 20. ] '''
- 벡터화된 형식의 수학 연산
print("변수 a의 값을 출력",a) print("변수 a의 값에 2를 곱한 값 출력", a*2) print("변수 a의 값에 2를 제곱한 값 출력",a**2) print("변수 a의 값에 루트를 적용한 값을 출력",np.sqrt(a)) ''' 출력 결과 변수 a의 값을 출력 [1. 2.5 4. 5.5 7. ] 변수 a의 값에 2를 곱한 값 출력 [ 2. 5. 8. 11. 14.] 변수 a의 값에 2를 제곱한 값 출력 [ 1. 6.25 16. 30.25 49. ] 변수 a의 값에 루트를 적용한 값을 출력 [1. 1.58113883 2. 2.34520788 2.64575131] '''
Numpy에서의 인덱싱과 슬라이싱
Numpy에서도 리스트와 동일하게 인덱싱과 슬라이싱 가능
scores= np.array([88, 72, 93, 94, 89, 78, 99])
- 인덱싱 2 지정, 마지막 요소 접근
a= scores[2], scores[-1] a ''' 출력 결과 (93, 99) '''
- 슬라이싱(마지막 항목 인덱스가 4일 때에는 4-1 scores[4]항목까지 슬라이싱)
a= scores[1:4],scores[3:0], scores[4:-1] a ''' 출력 결과 (array([72, 93, 94]), array([], dtype=int32), array([89, 78])) '''
- 생략 및 음수 인덱싱
ages= np.array([18, 19, 25, 30, 28]) ''' 출력 결과 (array([72, 93, 94]), array([], dtype=int32), array([89, 78])) '''
Numpy에서의 인덱싱과 슬라이싱
논리적인 인덱싱
- 논리적인 인덱싱(logical indexing)이란 어떤 조건을 주어서 배열에서 원하는 값을 추려내는 것
- ex. 사람들이 나이가 저장된 NumPy 배열 ages에서 20살 이상인 사람만 추출
반응형