[파이썬을 이용한 데이터 분석] 2. Numpy 2
* 본 포스팅은 '파이썬 라이브러리를 활용한 데이터 분석' 책 스터디 및 수업 내용 정리를 위한 것입니다*
1) random
numpy.random 모듈은 파이썬 내장 random 함수를 보강하여 다양한 종류의 확률 분포로부터 효과적으로 표본값을 생성하는 데 주로 사용된다. (한마디로 효율적으로 무작위 샘플을 만들 수 있다) 복권 추첨, 음악 CD의 재생 순서 섞기 등등...
(잘 몰랐던 용어)
난수 : 파이썬에서 random number라고 하는 것.
>random은 주사위를 던지는 상황을 생각해보면 된다. 주사위 각 면에 1부터 6까지 눈이 있어 던질 때마다 그 중 하나의 숫자가 선택되는데 직접 던지기 전에는 다음 번에 어떤 숫자가 나올지 알 수가 없다. 그런데 주사위를 600번 정도 던져보면 각 숫자가 대략 100번 정도 나오게 되는 데 이런 것을 난수라고 한다.
(참고 : https://wikidocs.net/79)
복원추출 : Sampling with replacement. 확률을 구할 때, 추출했던 것을 원래대로 돌려놓고 다시 추출하는 방법(중복 허용 O)
비복원추출 : Sampling without replacement. 표본공간에서 한 개의 표본을 추출하고 나서 다음 두 번째 표본을 추출할 때 첫 번째 표본을 복원하지 않고 계속해서 두 번째 추출을 하는 방법(중복 허용 X)
(참고 : https://www.scienceall.com/)
- randint : 주어진 최소/ 최대 범위 안에서 임의의 난수를 추출
randint명령은 numpy.random.randint(low, high=None, size=None)과 같은 인수를 가진다.
high를 입력하지 않으면 0과 low 사이의 숫자를, high를 입력하면 low와 high 사이의 숫자를 출력하며 size는 난수의 숫자이다.
import numpy as np
import random
l = np.array([10,20,30,40,50,60,70])
print(len(l))
#복원
for _ in range(5):
#0부터 len(l)=7, 0~7 사이의 숫자, 7은 포함하지 않으니, l배열의 0~6자리의 숫자 랜덤 추출
print(l[np.random.randint(0,len(l))], end = ' ')
#0과 len(l)=7 사이에서 5개씩 추출(0~7) 마지막 숫자'7'은 포함하지 않음
print(np.random.randint(len(l), size=5))
결과 : 7
30 60 70 10 50 <---이 값은 계속 바뀜 (10 30 10 20 10 , 50 60 10 20 10이런식으로 나오기도 함)
[3 6 0 0 2] <-- 이 값도 계속 바뀜 ([2 3 1 2 0], [4 4 3 3 4] 이런식으로 )
-
sample : 첫 번째 인자로 받은 seq or set에서 N개의 랜덤하고, unique하며 순서상관없이 인자를 뽑아 리스트로 만들어 반환한다.
random.sample(seq or set, N) : 첫 번째 매개변수로 시퀀스 데이터 타입(튜플, 문자열, range, list) 혹은 set type을 받을 수 있다.
두 번째 매개변수 N은 랜덤하게 뽑을 인자의 개수
(참조: https://blockdmask.tistory.com/383)
import numpy as np
import random
l = np.array([1,2,3,4,5,6,7])
#비복원
#값이 중복되어 출력되지 않음
#k는 몇 개의 값을 추출할 것인지를 결정하는 매개변수.리스트 내에 있는 인자의 개수보다 크면 error발생
print(random.sample(list(l), k = 5 ))
print(random.sample(range(1,46), k = 6))
결과 : [1, 5, 2, 7, 6]
[18, 20, 32, 5, 2, 43]
- choice : 이미 있는 데이터 집합에서 일부를 무작위로 선택하는 것을 샘플링(sampling)이라고 하며 choice를 이용해서 샘플링을 할 수 있다.
choice 함수는 매개변수로 seq타입을 받게 된다.
np.random.choice(a, size=None, replace=True, p=None)
a : 배열이면 원래의 데이터, 정수면 range(a)명령으로 데이터 생성
size : 추출할 원소 갯수
replace : True/False. True면 복원추출, False면 비복원추출, 즉 중복여부에 대한 표시, 기본적으로 True
p : 각 데이터가 추출될 확률
#복원
print(np.random.choice(range(1,46), 6))
print(np.random.choice(range(1,46), 6, replace = True))
#비복원
print(np.random.choice(range(1,46), 6, replace = False))
결과 : [33 45 17 43 38 22]
[32 12 28 31 28 32]
[42 30 18 16 31 2]
#확률에 따른 추출
A = 'air book cat d e f god'
A = A.split(' ') #공백 기준으로 쪼개어 리스트로 결과 출력
print(A)
#p 부분에 각 원소의 확률 적어줌, 임의의 값을 더 많이 나오게 구성 가능
print(np.random.choice(A, 3, p = [0.1,0.1,0.1,0.1,0.1,0.1,0.4]))
결과 : ['air', 'book', 'cat', 'd', 'e', 'f', 'god']
['god' 'book' 'god']
2) sort
파이썬의 내장 리스트형처럼 Numpy 배열 역시 sort를 이용해서 정렬할 수 있다.
참고 자료: https://rfriend.tistory.com/357
3) 파일 입출력 (file i/o)
numpy는 디스크에서 텍스트나 바이너리 형식의 데이터를 불러오거나 저장할 수 있다.
np.save와 np.load는 배열 데이터를 효과적으로 디스크에 저장하고 불러오기 위한 함수이다.
#numpy : file i/o
x = np.arange(1, 10).reshape(3, 3)
print(x)
#binary 로 저장
np.save('test', x)
#txt파일
np.savetxt('test2', x)
test1 = np.load('test.npy') #binary 파일 읽을 때
test2 = np.loadtxt('test2') #txt파일 읽을 때
print(test1)
print(test2)
결과 > 이런식으로 파일 2개가 생성되어 저장되었다.
np.savez() : 여러 개의 배열을 1개의 압축되지 않은 *.npz포맷 파일로 저장함
x = np.array([0,1,2,3,4])
y = np.array([5,6,7,8,9])
#각 배열에 이름 부여 배열=이름
np.savez('test00', x=x, y=y)
test00_load = np.load('test00.npz')
print(type(test00_load))
print(test00_load['x'])
print(test00_load['y'])
결과 > 아래와 같이 .npz파일이 생성되었음
<class 'numpy.lib.npyio.NpzFile'>
[0 1 2 3 4]
[5 6 7 8 9]
4) 그 외 (empty_like, tile, broadcast)
- empty_like : 기존의 배열에서 구조가 일치하는 배열 만들 때 사용, 특정한 값으로 초기화하지 않은 배열 생성할 수 있다.
import numpy as np
x = np.arange(1, 10).reshape(3, 3)
print(x)
y = np.array([1,0,1])
print(y)
#기존의 배열에서 구조가 일치하는 배열 만들 때 사용함,모든 값이 비어있는 배열
#난수와 다른 임의의 값이 들어가며 값은 메모리에 저장된 내용에 따라 달라짐
#메모리가 초기화되지 않기 때문에 쓰레기?값들이 들어가 있음
z = np.empty_like(x)
print(z)
결과 :
[[1 2 3]
[4 5 6]
[7 8 9]]
[1 0 1]
[[-2305843009213693952 -2305843009213693952 3419481639920009221]
[ 7017855544037830241 8750546175702871859 3402238841932703860]
[ 7161128222773766515 7740895507188769131 3399705548884422508]]
- tile : 배열을 반복하면서 새로운 축을 추가한다.
참고: https://rfriend.tistory.com/tag/np.tile
np.tile(배열, 반복하고자 하는 횟수)
#y라는 배열을 가지고, 3차원으로 1번 반복. 즉 y라는 배열 3개 쌓음
tt = np.tile(y, (3,1))
print(tt)
결과 :
[[1 0 1]
[1 0 1]
[1 0 1]]
-
Broadcasting
(참고: https://sacko.tistory.com/16)
모양이 다른 배열들 간의 연산이 어떤 조건을 만족했을 때 가능해지도록 배열을 자동적으로 변환하는 것이라고 정의할 수 있다.
[브로드캐스팅이 일어날 수 있는 조건]
1) 차원의 크기가 1일 때 가능
- 두 배열 간의 연산에서 최소한 하나의 배열의 차원이 1이라면(행/열의 어떤 축이든, 몇 번째 축이든 상관 없음) 가능
2) 차원의 짝이 맞을 때 가능
- 3,4,2의 길이를 가진 3차원 배열과 4,2의 길이를 가진 2차원 배열이 있을 때,
2차원 배열의 4,2가 3차원 배열의 4,2와 짝이 맞기 때문에 누락된 부분인 '3'만큼의 차원 확장(broadcasting)이 되고 합 연산이 수행된다.
브로드캐스팅은 저차원의 배열을 연산을 위해서 고차원 배열로 확장시키는 것과 같다.
#broadcast, 알아서 구조를 맞춰서 연산함.자동으로 구조 확장
#x, y는 위의 것과 동일
x = np.arange(1, 10).reshape(3, 3)
y = np.array([1,0,1])
brd = x + y
print(brd)
결과 :
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]]
[이전 글]
https://crystal-studyroom.tistory.com/6
'TECH > Data' 카테고리의 다른 글
[파이썬을 이용한 데이터 분석] 6. pandas 4 (0) | 2020.07.10 |
---|---|
[파이썬을 이용한 데이터 분석] 5. Pandas 3 (0) | 2020.06.02 |
[파이썬을 이용한 데이터 분석] 4. Pandas 2 (0) | 2020.06.02 |
[파이썬을 이용한 데이터 분석] 3. Pandas (0) | 2020.05.29 |
[파이썬을 이용한 데이터 분석] 1. Numpy (0) | 2020.05.21 |