2023/08/07
**numpy
1. numpy
- 고성능의 과학적 계산을 수행하기 위한 패키지(선형 대수를 위한 C 또는 Fortan 패키지 - CPython 에서만 가능)
- 파이썬 머신러닝 스택의 기초
- pypi : python 으로 만든 python, 일반 응용 프로그램을 만들 때는 가장 빠른 컴파일러
딥러닝에서는 numpy의 ndarray 만을 이용
- 다차원 배열인 ndarray를 제공하고 빠른 배열 계산과 유연한 브로드캐스팅 연산을 지원
- C 와 Fortran으로 만들어져서 CPython에서만 사용이 가능함.
- 설치 : pip install numpy
아나콘다 설치 or 머신러닝이나 딥러닝 패키지를 설치하면 자동으로 설치가 됨.
- import
import numpy : numpy 패키지는 numpy 라는 이름으로 가져와서 사용 - numpy.array()
from numpy import * : numpy패키지의 모든 내용을 현재 패키지로 가져와서 사용 - array()
import numpy as np : numpy 패키지를 np라는 이름으로 가져와서 사용 - np.array()
실습에 사용한 jpynb 파일을 올려드리겠습니다.
사용환경은 주피터 / colab 둘다 상관이 없습니다!
https://drive.google.com/file/d/1Z3c37iNHpSxr5Eyc1mY3Jx4hMvQ1F9Gi/view?usp=sharing
numpy.ipynb
Colaboratory notebook
drive.google.com
1.1) ndarray
- 배열(Array) : 모두 동일한 자료형의 grid, 확장 불가능
- list 나 tuple 보다 생성 방법이 다양하고 사용 가능한 작업도 많음
- 벡터화 된 연산을 지원하기 때문에 연산 속도가 빠름
- 머신러닝, 딥러닝(머신러닝 중 신경망을 이용하는 지도학습의 일종)에서 사용하는 자료의 기본 단위
numpy 실습
속도비교
import numpy as np
import datetime
#list 의 작업시간
li = range(1,1000000)
#현재 시간 저장
a = datetime.datetime.now()
print("시작시간:" , a)
# 모든 원소에 10을 곱해서 list를 수정
for i in li :
i = i * 10
s = datetime.datetime.now()
print("종료시간:", s)
print("경과시간:", (s-a))
시작시간: 2023-08-07 15:27:34.052748
종료시간: 2023-08-07 15:27:34.226787
경과시간: 0:00:00.174039
ar = np.arange(1, 1000000)
s = datetime.datetime.now()
print("시작시간:", s)
ar = ar * 10
s = datetime.datetime.now()
print("종료시간:",s)
시작시간: 2023-08-07 15:27:35.755868
종료시간: 2023-08-07 15:27:35.758972
일반적으로 list를 이용하는 것보다 numpy의 ndarray가 10배 이상 빠르다는 것을 알 수 있다.
1.2) ndarray 를 만드는 방법
- ndarray((행의 수,)) : 권장하지 않음
- array(iterator 객체) : 생성가능한데 copy 매개변수의 값을 True로 설정하면 복제를 하여 생성하고 False를 설정하면 참조만 복사.
copy의 기본 값은 True
- asarray 함수는 입력 데이터가 ndarray 가 아니면 복제를 하여 ndarray를 리턴, 입력 데이터가 ndarray 라면 참조만 복사
- 각 데이터의 자료형은 모두 일치해야 하는데 자료형 설정은 dtype 옵션을 이용해서 설정하는데 설정하지 않으면 유추해서 설정
- ndarray에는 copy 메서드가 제공되서 복제를 하고자 하는 경우 copy 메서드를 이용하면 됩니다.
1.3) 정보 확인
- 데이터 출력은 print 함수에 ndarray를 대입
- ndarray 의 속성
dtype : 요소의 자료형
ndim : 배열의 차원
shape : 각 차원의 크기를 저장한 정수 tuple, 이미지 크기를 확인할 때나 데이터 구조를 확인할 때 많이 사용
size : 데이터의 개수
itemsize : 하나의 항목이 차지한 메모리 크기
nbytes : 전체 메모리 크기
- 배열의 특성 확인 - 데이터를 가져온 경우 반드시 확인
print(type(ar)) #ar의 자료형
print(ar.dtype) #ar에 저장된 요소의 자료형
print(ar.ndim) #ar의 차원 수, 1차원
print(ar.shape) #배열의 크기, 3개의 행
#배열 정보 확인
ar = np.array([1,2,3,])
print(type(ar)) #ar의 자료형
print(ar.dtype) #ar에 저장된 요소의 자료형
print(ar.ndim) #ar의 차원 수, 1차원
print(ar.shape) #배열의 크기, 3개의 행
<class 'numpy.ndarray'>
int32
1
(3,)
ar = np.array([[1,2,3],[4,5,6]])
print(ar.ndim) #ar의 차원 수, 2차원
print(ar.shape) #배열의 크기, 2행 3열
2
(2, 3)
이미지 데이터를 가져왔을 때 반드시 ndim과 shape를 확인해야 함.
1.4) 생성 함수
arrange([start], stop, [step], dtype=None) : 개수를 지정하지 않고 시작 위치, 종료 위치, 간격을 설정하여 데이터를 생성
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) : 확률 혹은 통계 실습을 할 때 많이 사용
ar = np.arange(1, 100, 2) #start, #stop, #간격
print(ar)
[ 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47
49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95
97 99]
ar = np.linspace(1,100, num= 10) #start, #stop, #개수
print(ar)
[ 1. 12. 23. 34. 45. 56. 67. 78. 89. 100.]
1.5) 특수 행렬
- zeros() 나 ones()를 이용하면 0 이나 1로 채워진 배열을 생성 - 차원은 매개변수로 받는데 1차원은 숫자 하나만 입력하면 되고 2차원 이상은 튜플로 설정(데이터 나열)
정수 한개를 튜플로 만들고자 하는 경우에는 (정수, ) 형태로 ,를 해주어야 한다.
- zeros_like 나 ones_like 함수는 배열을 매개변수로 받아서 동일한 모양의 0 이나 1로 채워진 배열을 리턴
- empty 나 empty_like 는 값을 초기화하지 않고 배열을 생성해서 리턴
- eye 나 identity 함수를 이용하면 대각선 방향으로 1을 채운 배열을 리턴
eye(N, M = k, dtype=T/F) M은 열의 수, k는 대각의 위치로 기본은 0, 0이면 가운데 대각선이고, 정수를 입력시 좌우로 대각선이 이동
#eye - 대각선 방향으로 1을 채운 행렬
ar = np.eye(3) #3,3 행렬을 만들고 대각선 방향으로 1을 채움
print(ar)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
ar = np.eye(3, k=1) #정수 값 -> 기본에서 오른쪽 위로
print(ar)
ar = np.eye(3, k=-1) #음수 값 - 기본에서 왼쪽 아래로
print(ar)
[[0. 1. 0.]
[0. 0. 1.]
[0. 0. 0.]]
[[0. 0. 0.]
[1. 0. 0.]
[0. 1. 0.]]
- diag() : 정방 행렬을 대입받아서 대각 요소만 추출해서 배열을 생성해주는 함수
eye와 k의 옵션은 동일.
ar = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(ar)
br = np.diag(ar) # 대각선 배열 추출
print(br)
br = np.diag(ar, k=-1) # 정수 이동 후 추출
print(br)
#결과
[[1 2 3]
[4 5 6]
[7 8 9]]
[1 5 9]
[4 8]
1.6) dtype
- 배열의 요소의 자료형
- 배열은 동일한 자료형으로 만들어진 빈 공간없이 연속해서 저장 리스트
- 데이터를 만들 때 자료형을 설정하지 않으면 numpy 가 유추해서 설정을 하고 dtype 옵션을 이용해서 자료형을 설정하면 그 자료형으로 만드는데 자료형 변경에 실패하면 예외가 발생
- dtype 속성을 이용해서 확인 가능
- astype 함수를 이용하면 자료형을 변경해서 생성하는 것도 가능
- 자료형
정수 : int8, 16, 32, 64, uint8, uint32, uint64 (u가 없으면 음수까지, 있으면 양수만)
실수 : float16, float32, float64, float128
복소수 : complex64, complex128, complex256
불린 : bool
객체 : object
문자열 : string_
유니코드 : unicode_
1.7) 행렬의 차원 변환
- reshape(변경할 차원을 튜플로 대입) : 기존 배열을 수정해서 새로운 배열로 생성
-1 을 대입하면 1차원 배열로 생성
저차원을 고차원으로 변경하기도 하고 고차원의 데이터를 저차원으로 변경하기도 합니다.
- flatten() : 다차원 배열을 1차원으로 변경하는데 복사본을 가지고 작업해서 새로운 배열을 리턴
- 딥러닝에서 이미지의 경우 모두 동일한 차원인 경우만 학습이 가능합니다.
이미지 데이터를 가져오면 모든 이미지를 동일한 차원의 데이터로 수정을 해야하는데 이때 reshape나 flattern 함수를 이용합니다.
딥러닝에서는 차원의 개수도 맞아야만 학습이 가능합니다.
matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(matrix)
print("\n")
ar = matrix.reshape(-1)
ar[0] = 101
print(ar)
print(matrix)
br= matrix.flatten() # 복제를 해서 1차원으로 변경 - 원본과다른 데이터
print(br)
br[0] = 201
print(matrix)
1.8) 인덱싱
: 하나의 데이터를 가져오는 것
일차원 배열의 경우 [인덱스]를 이용해서 인덱스 번째 데이터를 가져오는 것이 가능
인덱스에 음수 사용시 뒤에서 부터 가져옴.
- 배열 내에서 데이터를 골라 내는 것
- 일차원 배열
[인덱스] : 해당 위치 데이터
[시작위치:종료위치] : 종료 위치 바로 앞까지
[시작위치:] : 시작위치 부터 끝까지
[:종료위치] : 처음 부터 종료위치 바로 앞까지
[:] : 전체
- 다차원 배열
[행번호][열번호] : 슬라이싱
[행번호, 열번호] : 인덱싱
행 번호나 열번호를 생략하면 생략한 부분 전체
다차원 배열의 경우는 맨 뒤에서 부터 생략이 가능한데 생략하면 생략한 번호는 전체로 간주함.
- 기본 인덱싱은 참조를 리턴
슬라이싱은 복제
: 데이터의 범위를 설정해서 가져오는 것, :을 이
matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(matrix) #전체 출력
print(matrix[0][1]) #0번째 행에 1번째 열
print(matrix[0]) #0번째 행을 선택할 때는 열 인덱스를 제외
print(matrix[:][0]) #0번째 열을 선택할 때는 행에 전체라고 설정을 해야 합니다.
#행렬 구조가 있을 때 행을 먼저 선택하고 열을 선택하기 때문에, 행을 생략할 수 없다
print(matrix[0:2]) #0번째 행부터 2번째 행 앞까지
#일반 인덱싱은 참조를 복사
x = 1004
print(x)
print(matrix[0][0]) #[행번호][열번호] 이렇게 접근하는 경우는 슬라이싱이라고 하고
#[행번호][열번호] 이렇게 접근하는 것이 인덱싱
#슬라이싱은 복제를 합니다.
#인덱싱은 참조를 복사합니다.
#결과
[[1 2 3]
[4 5 6]
[7 8 9]]
2
[1 2 3]
[1 2 3]
[[1 2 3]
[4 5 6]]
1004
1
- Fancy Indexing
인덱싱을 할 때 list를 사용하는 것
Fancy Indexing은 복제를 한다.
- 슬라이싱과 팬시 인덱싱 실습
#list를 이용하는 인덱싱을 팬시 인덱싱이라고 한다.
cr = matrix[[0]]
#범위를 이용하는 형태를 슬라이싱이라고 한다.
dr = matrix[0][:]
#팬시 인덱싱과 슬라이싱은 복제를 하기 때문에, 원본의 값을 바꾸지 않음.
print(cr) #[[100, 2, 3]]
print(dr) #[100, 2, 3]
cr[0, 0] = 1004
print(cr) #[[1004, 2, 3]]
print(dr) #[100, 2, 3]
print(matrix)
#결과
[[100 2 3]]
[100 2 3]
[[1004 2 3]]
[100 2 3]
[[100 2 3]
[ 4 5 6]
[ 7 8 9]]
- boolean indexing
인덱스에 bool 배열을 대입해서 True 인 데이터만 골라내는 것
배열 대신에 연산을 삽입해도 됩니다
numpy의 배열 과 scala 데이터의 연산은 배열의 모든 데이터를 순회하면서 연산을 수행하고 그 결과를 배열로 리턴
- 조건시 or 을쓰면 Error -> | 사용
ar = np.array([10, 2, 33, 51, 1, 32])
br = np.array([1, 2, 3, 4, 5, 6])
print(br[(ar >= 30) | (ar <= 10)])
- and, or : bool 데이터를 가지고 연산을 수행
파이썬은 데이터가 없는 데이터 묶음, 0, None을 False로 간주함
- &, |, ^ : 비트 단위로 연산을 수행
#일차원 배열 과 이차원 배열 생성
li = list(range(1,10))
print(li)
#[1, 2, 3, 4, 5, 6, 7, 8, 9]
#list를 이용해서 ndarray 생성
ar = np.array(li)
print(ar)
#[1 2 3 4 5 6 7 8 9]
matrix = np.array(li).reshape((3,3))
print(matrix) #1차원의 배열 생성 후 이를 3 x 3의 배열로 변경
#[[1 2 3]
# [4 5 6]
# [7 8 9]]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1 2 3 4 5 6 7 8 9]
[[1 2 3]
[4 5 6]
[7 8 9]]
#인덱싱 - 데이터 1개 가져오기
data1 = ar[0]
data2 = matrix[0, 0]
data3 = matrix[0][0]
print(data1)
print(data2)
print(data3)
#이차원 배열에서 행 하나 찾아오기
row = matrix[0] #matrix[0][:]
print(row)
#이차원 배열에서 열 하나 찾아오기
column = matrix[:,0]
print(column)
1
1
1
[1 2 3]
[1 4 7]
##파이선에서의 복사
#파이썬에서의 데이터 복사
#일반 인덱싱한 데이터는 파이썬의 기본 데이터와 동일하게 동작을 합니다
#파이썬의 scala data는 일반적으로 immutable
#scala data는 다른 변수에 대입할 때 값을 복사해서 대입합니다
a = 10
b = a #b = 10
b = 5
print(a) #10
#파이썬의 vector data는 다른 변수에 대입할 때 참조를 복사하여 대입한다.
ax = [1,2,3]
bx = ax #bx는 [1,2,3]의 참조
bx[0] = 100
print(ax) # [100,2,3]
10
[100, 2, 3]
##파이썬에서의 데이터 복제
#copy 모듈의 copy(shallow copy - 얕은 복사) 와 deepcopy(깊은 복사) 함수 이용
#얕은 복사는 한 번은 복제를 하지만 재귀적으로 수행하지 않음
#깊은 복사는 재귀적으로 복제를 수행
import copy
li = [1,2,3]
c = li.copy()
c[0] = 100 #일차원 list의 경우는 원본에 영향을 주지 않음
print(li) #[1,2,3] 원본에 영향이 없음
m = [[1,2,3],[4,5,6]]
c = m.copy() #얕은 복사는 이차원 배열의 경우는 원본에 영향을 줌
m[0][0] = 100
print(m)
#copy.deepcopy는 재귀적으로 수행하기 때문에 원본의 값이 바뀌네?
d = copy.deepcopy(m)
print(d)
d[0][0] = 1004
print(m)
[1, 2, 3]
[[100, 2, 3], [4, 5, 6]]
[[100, 2, 3], [4, 5, 6]]
[[100, 2, 3], [4, 5, 6]]
#scala data 를 복사하는 경우는 원본의 값을 복사해서 대입하기 때문에
#서로 간에 영향을 주지 않는다.
data1 = 1000
print(data1)
print(ar)
data2 = 1000
print(data2)
print(matrix)
#row는 scala data(primitive type)가 아닌 vector data
#vector 데이터를 다른 곳에 대입하면 참조가 복사된다.
#복사본을 수정하면 원본동
row[0] = 1004
print(row)
print(matrix)
1000
[1 2 3 4 5 6 7 8 9]
1000
[[1 2 3]
[4 5 6]
[7 8 9]]
#데이터 복제는 copy() 메서드
clone = matrix.copy
clon[0][0] = 42 #복사본을 수정해도 그대로 유지
print(matrix)
- 슬라이싱 실습
li = [1,2,3,4,5]
c = li[0:3] #list의 슬라이싱 : 얕은 복사
#c 와 li 는 앞 3개의 데이터가 동일하지만 다른 공간의 데이터
print(c)
c[0] = 100 #c 의 값을 변경해도 li에는 영향이 없음
print(li)
ar = np.array(li)
d = ar[0:3] #배열에서 0번째 ~ 2번째 복사
#0~2번째 이므로 데이터는 3개(vector data)
#참조가 복사가 됨
print(d)
print(d is ar) # False
d[0] = 101 #배열의 슬라이싱 : deep copy
print(ar) #[101 2 3 4 5]
- fancy indexing 실습
#인덱싱을 할 때 list를 이용하는 것
ar = np.array([100, 200, 300, 400, 500])
f = ar[[0,2]]
print(f)
f[0] = 1004
print(ar) #원본에 변화는 없음
#[100 300]
#[100 200 300 400 500]
1.9) ndarray 의 boradcast 연산
- vectorized 연산 : ndarray 의 연산을 빠르게 수행하기 위해서 사용하는 방식
- broadcast 연산은 차원이 다른 경우 차원을 맞추어서 연산을 수행하는데 요소의 개수가 다르면 수행을 하지 못합니다.
- 산술 연산(+, -, *, /, %) 가능
#산술 연산
ar = np.array([1,2,3,4,5])
br = np.array([10,20,30,40,50])
result = ar+ br
print(result) #[11, 22, 33, 44, 55]
result = ar + 4 #[5, 6, 7, 8, 9]
print(result)
k = range(1,11)
cr = np.array(k)
print(cr)
cr = cr.reshape((2,5)) # 차원의 배열을 2행 5열로 수정하여 연산을 수행
print(cr)
print(ar + cr)
- 논리연산
>, >=, <=, ==, != 가능
numpy의 equal, not_equal, greater, greater_eqaul, less, less_equal 함수 이용 가능
numpy 에서는 logical_and, logical_or, logical_xor(같으면 False 다르면 True) 함수도 제공
- 연산 후 할당 가능
op =: 왼쪽의 데이터에 오른쪽의 데이터를 op에 따라 연산한 후, 왼쪽에
- in과 not in 연산 제공
in 은 포함하고 있는지 여부 확인
not in 은 포함안하고 있는지 확인
1.10) 벡터화 된 함수를 적용
- ndarray에 함수를 적용한 결과를 얻고자 하는 경우는 함수를 만들고 벡터화 된 함수를 만들어서 배열을 함수에 대입하면 됩니다.
- 벡터화된 함수를 만드는 방법은 numpy.vectorize(함수) 를 호출해서 리턴받으면 됩니다.
#벡터화된 함수 적용
#매개변수에 100을 더해서 리턴하는 함수
def f(i):
return i + 100
#벡터화된 함수로 수정
vector_f = np.vectorize(f)
#배열에 벡터화된 함수 적용
print(vector_f(ar))
#람다 함수를 이용해서 동일한 작업 수행
print(np.vectorize(lambda i:i+100)(ar))
1.11) 행과 열 전치
- T라는 속성을 이용하면 행과 열을 변경
- transpose 하는 함수를 이용하면 순서도 변경 가능 - 3차원 이상에서 사용
matrix = np.array(range(1, 11)).reshape((5,2))
print(matrix)
print(matrix.reshape((2,5))) # 행과 열의 수 변경
print(matrix.T) # 행과 열을 변경
print(np.transpose(matrix)) # 행과 열을 변경
2. numpy 함수
2.1) 랜덤 관련
- random.seed(seed = 시드 번호) : 시드를 설정, 난수표 설정
이 값을 고정시키면 난수가 일정한 패턴으로 리턴되고 이 값을 고정시키지 않으면 난수가 랜덤하게 생성되는 것 처럼 보이게 됩니다.
- random(데이터 개수), random_sample(데이터 개수) : 0.0~1.0 사이에서 개수만큼 리턴
- randint()
- rand(): 균등 분포에서 표본 추출
- randn() : 표준 편차가 1이고 평균값이 0인 정규 분포에서 표본 추출
- binominal(n, p, size) : 이항 분포에서 무작위 추출
n 은 나올 수 있는 개수, p는 확률, size는 개수
- logistic() : 로지스틱 분포에서 추출
- beta() : 베타 분포에서 추출
- gamma() : 감마 분포에서 추출
- chisquare() : 카이제곱 분포에서 추출
- uniform() : 균등 분포에서 추출
- permutation : 정수를 대입하면 0 부터 정수 이전까지 배열을 생성해서 숫자를 랜덤하게 배치하고 리턴하며 배열ㄷ을 대입하면 배열의 값을 랜덤하게 배치
유사한 함수로 shuffle()이 존재
- choice() : 배열에서 복원 추출을 이용해서 데이터를 리턴
2.2) 기본 통계 함수
- sum : 합계
- prod : 곱
- nanprod : None(numpy.nan) 은 1로 간주하고 곱
- nansum : None은 0 으로 간주하고 합
- mena, median : 평균과 중간 값
- max, min : 최대, 최소
- std, var : 표준편차와 분산
ddof 옵션을 1로 설정하면 비 편향 표준편차와 분산을 구해줌
ddof는 자유도
- percentile : 배열과 백분위 값을 받아서 배열에서 백분위에 해당하는 데이터를 리턴
- 2차원 배열의 경우는 옵션 없이 사용하면 전체 데이터를 기준으로 통계 값을 구하게 되고 axis 옵션을 이용하면 행 단위나 열 단위로 계산이 가능
- keepdims 옵션을 True로 설정하면 배열과 동일한 차원으로 결과를 리턴
#기본 통계 함수
#matrix = np.array([[10,20], [30, 40], [50, 60]])
matrix = np.random.randn(20).reshape((4,5))
print("1. ",matrix)
print("2. ",matrix.sum())
print("3. ",matrix.std())
print("4. ",matrix.std(ddof=1))
print("5. ",np.percentile(matrix, 75)) #75%에 해당하는 값
print("6. ",matrix.sum(axis=0)) #열단위 합
print("7. ",matrix.sum(axis=1)) #행 단위 합
print("8. ",matrix.sum(axis=1, keepdims=True)) #행 단위 - matrix 와 동일한 차원으로 만들어 리턴
- argmin, argmax : 최소 값과 최대 값의 인덱스
- cumprod : 누적 곱
- cumsum : 누적합
- diff : 차분을 구하는 것, n 값을 1로 설정하면 차분이지만, 2인 경우 차분의 차분이 됨.
2.3) 소수 관련 함수
- round :
- rint
- fix
- ceil
- floor
- trunc
2.4) 숫자 처리 함수
- abs
- sqrt
- square
- modf
- sign
2.5) 판별 함수
- isnan
- isfinite
- isinf
2.6) 집합 관련 함수
- unique() : 중복 제거
- intersect1d() : 교집합
- union1d() : 합집합
- in1d() : 존재여부
- setdiff1d() : 차집합
- setxor1d() : 한쪽에만 존재하는 데이터, 여집합
2.7) 배열의 데이터 정렬
- sort()
- numpy.sort() 는 배열을 받아서 정렬한 후 리턴
- 2차원 이상일 때는 정렬할 축 번호를 axis를 이용해서 설정
ar = np.array([20, 30, 10, 25, 67])
result = np.sort(ar)
print(result) #정렬됨
print(ar) #그대로
#2차원 배열에서 행에서의 정렬
br = np.array([[10, 60, 80], [20, 50, 30], [15, 32, 29]])
result = np.sort(br, axis = 1)
print(result)
3. ndarray
3.1) split : 분할해주는 함수
- axis 옵션을 이용해서 행이나 열 단위로 분할 가능
기본은 행 방향으로 분할하고 axis = 1 을 설정하면 열 방향으로 분할
- 두번째 파라미터에 N 값을 설정하면 N 개의 동일한 크기로 분할
list를 설정하면 list에 대입된 인덱스에 따라 분할을 수행
- 행 단위 분할을 많이 하고 열 단위 분할은 특별한 경우 수행
x = range(1, 51)
#위의 데이터를 가지고 10행 5열 짜리 이차원 배열 생성
ar = np.array(x)
print(ar)
matrix = ar.reshape((10,5))
print(matrix)
#행과 열의 개수 가져오기
print(matrix.shape)
print(type(matrix.shape))
cnt = matrix.shape[0]
print(cnt) # 행의 개수 10개
# 데이터를 가지고 7:3 분할 : numpy.split
# 여기에 permutation을 적용하면 샘플링 해주는 함수가 됩니다요
k = np.split(matrix, [int(cnt*0.7), int(cnt * 0.9)])
print(k[0])
print(k[1])
print(k[2])
3.2) 결합 함수
- concatenates: 2개의 배열 과 axis 옵션을 이용해서 배열을 합쳐서 하나를 만들어주는 함수
이 함수를 사용할 때는 합치고자 하는 방향의 데이터 개수가 같아야 합니다.
- numpy의 ndarray 나 pandas의 dataframe은 직사각형 모양만 가능
특정 셀이 없는 형태는 불가능
4. pandas
https://drive.google.com/file/d/1zZ0Yp985Nb-u9zB3He_ZMAUFRLUYTeGV/view?usp=sharing
2.data_collect.ipynb
Colaboratory notebook
drive.google.com
4.1) 개요
- 효과적인 데이터 분석을 위한 고수준의 자료구조와 데이터 분석 도구를 제공해주는 패키지
- 자료구조
Series : 인덱스를 갖는 1차원 데이터
DataFrame : 행과 열로 구성된 2차원 데이터
행열은 모든 데이터의 자료형이 일치해야 하지만, DataFrame(Table)은 열 방향으로만 데이터의 자료형이 일치하면 된다.
- 설치는 pip install pandas 인데 anaconda를 사용하면 설치가 되어 있음
- 사용할 때는 일반적으로 import pandas as pd 의 형태로 사용합니다.
데이터 분석을 많이 하는 경우에는 from pandas import Series, DataFrame 의 형태로도 사용함.
4.2) series
- 일차원 배열과 유사하지만 일차원 배열은 인덱스가 0부터 시작하는 번호이지만 Series는 0부터 시작하는 번호를 인덱스로 사용할 수 있고 별도의 인덱스를 설정하는 것도 가능
- 생성
Series(data, index=None, dtype=None, copy=False)
- data에는 list, tuple, set, ndarray 등이 대입될 수 있고 dict를 대입하면 dict의 key 가 index가 되고 value가 value가 됨.
dict를 제외한 데이터의 모임은 index가 0부터 시작하는 번호로 만들어 집니다.
- 각 데이터의 접근은 이름[인덱스]
- Series의 index 속성을 가져오면 인덱스 배열을 리턴해주고 values 속성을 호출하면 값의 배열을 리턴합니다.
index 속성이나 values 속성을 이용해서 직접 값을 변경하는 것도 가능합니다.
- numpy 의 함수나 연산을 그대로 사용할 수 있는데 이 경우는 values의 데이터를 가지고 수행합니다.
- 연속된 범위를 선택할 때 [시작번호:종료번호] 의 경우는 종료번호가 포함이 되지 않음.
[시작인덱스 : 종료인덱스] 의 경우는 종료 인덱스가 포함됨.
- Series 와 Series 의 연산은 동일한 인덱스끼리 수행
한쪽에만 존재하는 인덱스의 연산 결과는 NaN
NaN 과의 연산도 NaN
4.3) DataFrame
- 여러개의 컬럼으로 구성된 2차원 테이블 구조
- dict(DTO 클래스나 VO 클래스)의 배열과 유사한 구조
프로그래밍 언어에서 하나의 행을 만드는 방법
> 클래스를 만들고 동일한 클래스의 인스턴스를 생성하는 방법
이런 용도의 클래스를 Domain 이나 Entity, Model, DTO(Data Transfer Object), VO(Value Object) 클래스라고 합니다.
> Dictionary(dict, map 이나 hashtable) 의 인스턴스를 만드는 방법
> named tuple을 이용하는 방법
tuple의 각 속성에 name을 부여할 수 있는 것
- 생성
dict를 만들 때 각 키에 데이터의 모임을 할당을 하고 DataFrame 함수에 넘겨주면 key를 열의 이름으로 만들어서 DataFrame을 생성해 줍니다.
생성할 때 열의 순서를 변경하고자 하면 columns 옵션에 열의 순서를 나열하면 됩니다.
- 생성할 때 index와 columns 옵션을 이용해서 행의 이름이나 열의 이름을 설정할 수 있고 만든 후 index 속성이나 columns 속성으로 읽고 변경이 가능
- 탐색 관련 함수나 속성
values: 데이터를 2차원 배열(ndarray)로 리턴
head(개수) : 앞에서부터 개수만큼 리턴하는데 개수를 생략하면 5개
tail(개수) : 뒤에서부터 개수만큼 리턴하는데 개수를 생략하면 5개
info() : 데이터 프레임에 대한 정보 확인 - 행과 열의 개수 그리고 각 열에 대한 결측치 개수 및 자료형, 전체 메모리 사용량을 확인할 수 있습니다.
from pandas import DataFrame
import numpy
items = {'code': [1,2,3,4,5,6],
'name': ['apple','watermelon','oriental melon', 'banana', 'lemon', 'mango'],
'manufacture': ['korea', 'korea', 'korea','philippines','korea', 'taiwan'],
'price':[1500, 15000,1000,500,1500,700]}
#컬럼 이름 설정
data = DataFrame(items, columns=['code', 'name', 'manufacture', 'price'])
print(data)
print()
#인덱스 확인
print(data.index)
print()
#인덱스 변경
data.index = numpy.arange(1,7,1)
print(data.index)
print()
#앞에서 3개 데이터 확인
print(data.head(3))
print()
#데이터프레임 정보 확인
data.info()
5. pandas를 이용한 데이터 수집
5.1) 클립 보드의 데이터 가져오기
- pandas.read_clipboard()
5.2) 머신러닝을 학습하기에 알맞은 데이터 셋
- scikit-learn 이나 seaborn 등 파이썬 라이브러리에서 제공하는 데이터 셋
load_digits(): 숫자 이미지 데이터 - 분류
load_boston() : 보스톤 주택 가격 - 회귀
load_iris() : 붓꽃 데이터 - 분류
load_diabetes() : 당뇨병 데이터 - 회귀
load_linnerud() : 체력 검사 데이터 - 회귀
load_wine() : 와인 품질 데이터 - 분류
load_breast_cancer() : 유방암 데이터 - 분류
Kaggle: Your Machine Learning and Data Science Community
Kaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.
www.kaggle.com
- 데이콘 : https://dacon.io/
데이터사이언티스트 AI 컴피티션
8만 AI 팀이 협업하는 데이터 사이언스 플랫폼. AI 경진대회와 대상 맞춤 온/오프라인 교육, 문제 기반 학습 서비스를 제공합니다.
dacon.io
- UCI 머신러닝 저장소 : https://archive.ics.uci.edu/datasets
UCI Machine Learning Repository
Images of 13,611 grains of 7 different registered dry beans were taken with a high-resolution camera. A total of 16 features; 12 dimensions and 4 shape forms, were obtained from the grains.
archive.ics.uci.edu
- Open API
5.3) 텍스트 파일 읽기
- 종류 : 일반 텍스트 파일, fwf(일정한 간격을 갖는 텍스트), csv(콤마로 구분된 텍스트), tsv(탭으로 구분된 텍스트)
최근에는 거의 csv만 사용됨.
일반 텍스트 파일은 대부분 자연어 처리에서 사용
- csv 파일 읽는 함수
pandas.read_csv(파일 경로 - 기본 구분자가 ,)
pandas.read_table(파일 경로 - 기본 구분자가 tab)
특별한 옵션을 설정하지 않으면 첫 행의 데이터가 컬럼의 이름이 됩니다.
- csv 파일을 읽고자 하는 경우
첫 행의 데이터가 컬럼 이름인지 확인
구분자가 무엇인지 확인
한글의 존재 여부를 확인
데이터 건수가 어느 정도 되는지 확인
첫 몇 개의 행이 데이터가 아닌지 확인
- items.csv 파일 읽기 - 첫 행이 컬럼의 이름이고 구분자가 , 이고 한글이 없음.
items = pd.read_csv('/content/drive/MyDrive/lg dx data 스쿨 1기/data (1)/data/items.csv')
print(items)
- read_csv 옵션
첫번째 매개변수는 파일의 경로로 생략 불가능
sep : 구분자
header : 컬럼 이름으로 사용할 행 번호로 기본은 0인데 없을 때는 None 설정
index_col : 인덱스로 사용할 컬럼 번호나 컬럼 이름
encoding : 인코딩 종류를 지정
thousands : 천 단위 구분 기호 설정
skiprows : 건너 뛸 행의 개수
nrows : 처음 읽을 때 몇 개의 행을 읽을 것인지 설정
skip_footers : 마지막 몇 개의 행을 읽지 않을 것인지 설정
na_values : NA 값으로 처리할 값들의 list
import pandas as pd
items = pd.read_csv('/content/drive/MyDrive/lg dx data 스쿨 1기/data (1)/data/item.csv', index_col ='code')
print(items)
#index_col을 통해 primary key를 인덱스로 설정
items = pd.read_csv('/content/drive/MyDrive/lg dx data 스쿨 1기/data (1)/data/good.csv')
print(items) #열이 없이 데이터만 존재하여, 첫 데이터가 열로 인식되는 문제 발생
#good.csv는 첫번째 행도 일반 데이터이므로
#names 를 활용하여 열을 사용해야한다.
import pandas as pd
items = pd.read_csv('/content/drive/MyDrive/lg dx data 스쿨 1기/data (1)/data/good.csv', header=None, names=['제품명', '개수', '가격'], thousands=',')
print(items)
- 데이터의 양이 많을 때
실제 로그 데이터는 파일의 사이즈가 크고 데이터가 많습니다.
이런 경우 PC에서 읽을려고 하면 읽어지지 않는 경우가 많음.
이럴 경우에는 일정한 크기로 분할해서 읽어서 모델을 만든 후 일부분을 다시 읽어서 모델을 재 생성하는 방식을 사용.
읽을 때 chunksize 라는 옵션을 사용해서 데이터를 읽으면 데이터를 순회하면서 읽을 수 있는 TextParser 객체를 리턴하는데 이 객체를 이용해서 데이터를 부분적으로 읽어 올 수 있습니다.
nrows 옵션과 skiprows 옵션을 이용하면 일부분씩 읽어올 수 있다.
'LG 헬로비전 DX DATA SCHOOL > Python' 카테고리의 다른 글
Python 탐색적 시각화 (2) | 2023.08.11 |
---|---|
Python 데이터 분석 Pandas 2 (0) | 2023.08.09 |
Django REST API (0) | 2023.07.27 |
Django (0) | 2023.07.26 |
Python 예외처리 / File handling (0) | 2023.07.14 |