1.Numpy(Numerical Python)
우리는 실생활에서 접하는 많은 데이터를 "숫자 배열"로 볼 수 있다.
따라서, 파이썬에서는 대규모 다차원 배열을 다룰 수 있게 도와주는 라이브러리를 이용하여 데이터 분석을 할 수 있다.
배열은 파이썬 리스트로도 가능하지만, numpy는 리스트에 비해 빠른 연산을 지원하고 메모리를 효율적으로 사용한다는 장점이 있다. 작은 데이터는 리스트로도 빠른 연산이 가능할테지만, 분석할 데이터가 크면 클수록 시간이 오래걸리기 때문에 numpy를 이용하는 것이다.
리스트로 만들어지는 배열에는 다양한 자료형들이 함께 들어갈 수 있다. ex)arr=[1,2,"three",4.0, [5,6]]
하지만, numpy를 이용하여 만들어지는 배열에는 한 가지 자료형만 들어갈 수 있다.
아래에는 라이브러리에 있는 함수를 이용해서 다양한 배열을 만드는 방법 중 일부이다.
#배열 arr 만들기
import numpy as np
arr=np.aaray([1,2,3,4,5])
arr=np.array([3,1.5,2,7]) #실수형 원소가 속해있으면 모두 다 실수형 원소로 만들어짐-why? 한 가지 자료형만 들어갈 수 있으므로
arr=np.array(([1,2],[3,4])) #괄호 2개 주의
arr=np.array([1,2,3,4],dtype='float') #dtype을 이용하여 배열 데이터 타입을 정해줄 수 있음
arr=np.zeros(10,dtype=int) #배열의 데이터가 정수형 0 10개로 이루어진 배열 생성
arr=np.ones((3,5),dtype=float) #모든 배열의 데이터가 실수형1(1.)인 3*5(3행5열)배열 생성
arr=np.arange(5) #0~4 범위의 데이터를 갖는 배열 생성->[0,1,2,3,4]
arr=np.arange(0,20,2) #배열의 데이터가 차례대로 0이상 20미만 2씩 건너뛰도록하는 배열 생성
#np.linspace(시작점, 끝점, 갯수, (끝점 포함 여부), (숫자 사이의 간격 반환여부))
arr=np.linspace(0,1,5) #배열의 데이터가 0부터 1까지의 범위 내에서 균등한 간격으로 5개를 추출하여 배열 생성-[0.,0.25,0.5,0.75,1.]
arr=np.linspace(0,1)#괄호 안에 세번째 인수를 안쓸 경우 초기화값은 50 ->50개 추출
arr=np.linspace(0,1,10,endpoint=False) #끝점인 1을 포함하지 않고 싶으면 endpoint=False 추가
arr=np.linspace(1,2,10,endpoint=False, retstep=True) #맨 끝에 retstep=True를 추가하면 숫자사이의 간격 반환됨
arr=np.random.random(7) #0~1사이에서 랜덤하게 7개의 난수를 뽑아 배열 생성
arr=np.random.random((2,2)) #0~1사이에서 랜덤하게 난수를 뽑아 2*2배열 생성
arr=np.random.normal(0,1,5) #평균이 0이고 표준편차가 1인 정규분포에서 5개의 난수를 뽑아 배열 생성
arr=np.random.normal(0,1,(2,2)) #평균이 0이고 표준편차가 1인 정규분포에서 난수를 뽑아 2*2배열 생성
arr=np.random.randint(0,5,3) #0이상 5미만의 범위 내에서 3개의 정수형 난수를 뽑아 배열 생성
arr=np.random.randint(0,10,(2,2)) #0이상 10미만의 범위 내에서 정수형 난수를 뽑아 2*2배열 생성
arr=np.random.randint(10,size=(2,2)) #0이상 10미만의 범위 내에서 정수형 난수를 뽑아 2*2배열 생성(위에서 0생략한 형태)
아래는 배열의 기본 정보(차원, 모양, 크기, 데이터 타입)를 알 수 있는 코드이다.
#배열의 기초1 -위에서 만든 배열 arr로 실습
arr.ndim #배열의 차원
arr.shape #배열의 모양(행과 열을 나타내는 튜플을 반환-ex)(2,2))
arr.size #배열의 크기(전체 데이터(원소)의 갯수)
arr.dtype # 배열의 데이터 타입
numpy라이브러리를 사용하여 만든 배열은 리스트와 같이 인덱싱과 슬라이싱이 가능하다. (코드 작성 생략)
배열을 이어서 붙이거나 분할이 가능하다.
#배열의 기초2
arr=np.arange(8) #0~7범위의 데이터를 갖는 배열 생성 [0, 1, 2, 3, 4, 5, 6, 7]
arr2=arr.reshape((2,4)) #arr의 shape를 2*4로 변경한 배열 생성 [[0, 1, 2, 3],[4, 5, 6, 7]] ->주의) 변경 대상 배열의 전체 원소의 갯수가 변경하고자하는 배열의 원소의 갯수와 같아야함
#배열을 이어붙이기-> 주의) 이어서 붙이려는 배열의 차원이 반드시 같아야함
arr1=np.array([0,1,2])
arr2=np.array([3,4,5])
arr=np.concatenate([arr1,arr2]) #두 배열 arr1과 arr2를 이어 붙인 배열 생성 [0, 1, 2, 3, 4, 5]
#np.concatenate-axis축을 기준으로 배열을 이어붙임
matrix=np.arange(4).reshape(2,2) #[[0,1],[2,3]]
arr=np.concatenate([matrix,matrix],axis=0) #axis=0이면 세로방향으로 두 배열을 이어붙임 [[0,1],[2,3],[0,1],[2,3]]
arr=np.concatenate([matrix,matrix],axis=1) #axis=1이면 가로방향으로 두 배열을 이어붙임 [[0,1,0,1],[2,3,2,3]]
matrix=np.arange(16).reshape(4,4)
#np.split-axis축을 기준으로 배열을 분할
upper,lower=np.split(matrix,[3],axis=0) #axis=0이면 세로방향으로 내려가 3행을 기준으로 배열을 분할-> 위의 배열은 upper, 아래 배열은 lower
left,rightr=np.split(matrix,[3],axis=1) #axis=1이면 가로방향으로 옆으로가 3열을 기준으로 배열을 분할-> 왼쪽 배열은 left, 오른쪽 배열은 right
배열은 기본 연산(+,-,*,/)과 행렬끼리의 연산을 지원한다.(코드 작성 생략)
브로드캐스팅(Broadcasting): shape가 다른 배열끼리 연산도 가능(코드 작성 생략)
집계함수를 사용하여 데이터에 대한 요약 통계를 구할 수 있다.
#집계함수
arr=np.arange(8).reshape((2,4)) #[[0,1,2,3],[4,5,6,7]]
sum=np.sum(arr) #모든 데이터의 합 28
sum1=np.sum(arr, axis=0) #세로방향으로 데이터를 더한 값 [4,6,8,10]
sum2=np.sum(arr, axis=1) #가로방향으로 데이터를 더한 값 [6,22]
min=np.min(arr) #데이터의 최솟값
max=np.max(arr) #데이터의 최댓값
mean=mp.mean(arr) #데이터의 평균
마스킹 연산: True, False를 통해서 특정 값들을 뽑아내는 방법
#마스킹 연산
arr=np.arrange(5) #[0,1,2,3,4]
arr<3 #[True,True,True,False,False]
arr>5 #[False,False,False,False,False]
arr[arr<3] #True인 데이터만 뽑아냄 [0,1,2]