[파이썬을 이용한 데이터 분석] 2. Numpy 2

2020. 5. 28. 13:43

* 본 포스팅은 '파이썬 라이브러리를 활용한 데이터 분석' 책 스터디 및 수업 내용 정리를 위한 것입니다*

 

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

 

[Python] numpy array 정렬, 거꾸로 정렬, 다차원 배열 정렬

이번 포스팅에서는 Python numpy 배열을 정렬(array sorting)하는 방법에 대해서 소개하겠습니다. - (1) 1차원 배열 정렬 : np.sort(x) - (2) 1차원 배열 거꾸로 정렬 : np.sort(x)[::-1] , x[np.argsort(-x)] - (..

rfriend.tistory.com

 

 

 

3) 파일 입출력 (file i/o)

numpy는 디스크에서 텍스트나 바이너리 형식의 데이터를 불러오거나 저장할 수 있다.

np.savenp.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

 

[파이썬을 이용한 데이터 분석] 1. Numpy

* 본 포스팅은 '파이썬 라이브러리를 활용한 데이터 분석' 책 스터디 및 수업 내용 정리를 위한 것입니다* Overview Numpy 개념, 장점 및 활용 개념 및 구성요소 Numpy Numerical Python. 파이썬에서 산술 계�

crystal-studyroom.tistory.com

 

BELATED ARTICLES

more