(7주차) 4월13일
numpy (rand, randn, randint, choice, 통계분포, np.where/np.argwhere, 인덱싱고급, np.ix_)
-
(1/3) rand, randn
-
(2/3) randint
-
(3/3) choice, 통계분포, np.where/np.argwhere, 인덱싱고급, np.ix_
import numpy as np
-
0~1사이에서 10개의 난수 생성
np.random.rand(10)
-
0~2사이에서 10개의 난수 생성
np.random.rand(10)*2
-
1~2사이에서 10개의 난수 생성
np.random.rand(10)+1
-
1~3사이에서 10개의 난수 생성
np.random.rand(10)*2+1 # 1~3
-
N(0,1)에서 10개 추출
np.random.randn(10) # 표준정규분포에서 10개의 샘플 추출
-
N(1,1)에서 10개 추출
np.random.randn(10)+1
-
N(0,4)에서 10개 추출 (평균이 0이고 분산이 4인 분포)
np.random.randn(10)*2
-
N(3,4)에서 10개 추출
np.random.randn(10)*2+3
-
[0,7)의 범위에서 하나의 정수를 랜덤으로 생성
np.random.randint(7) # [0,7)의 범위에서 하나의 정수 생성
-
[0,7)의 범위에서 20개의 정수를 랜덤으로 생성
np.random.randint(7,size=(20,)) # [0,7)의 범위에서 20개의 정수 생성
-
[0,7)의 범위에서 (2,2) shape 으로 정수를 랜덤으로 생성
np.random.randint(7,size=(2,2)) # [0,7)의 범위에서 (2,2) shape의 정수 생성
-
위와 같은 코드를 아래와 같이 구현가능
np.random.randint(low=7,size=(5,5)) # [0,7)의 범위에서 (5,5) shape의 정수 생성
-
[10,20) 의 범위에서 (5,5) shape 정수를 랜덤으로 생성
np.random.randint(low=10,high=20,size=(5,5)) # [10,20)의 범위에서 (5,5)shape의 정수생성
-
의문: np.random.randint(low=7,size=(5,5))
가 좀 이상하다. 사실 np.random.randint(high=7,size=(5,5))
가 되어야 맞지 않는가?
-> 저도 그렇게 생각하긴 하는데요, 구현이 이렇게 되어있습니다. 도움말 확인!
Return random integers from the "discrete uniform" distribution of the specified dtype in the "half-open" interval [`low`, `high`). If `high` is None (the default), then results are from [0, `low`).
-
ver1
np.random.choice(5,20) # [0,5)에서 20개를 뽑음, 중복허용
- 이것은 np.random.randint(5,size=(20,)) 와 같은 코드임
-
ver2
np.random.choice([0,1,2,3],20) # [0,1,2,3]에서 20개를 뽑음, 중복허용
np.random.choice(["apple","orange","banana"],20)
np.random.choice(["apple","orange","banana"],2,replace=False) # 중복허용 X
np.random.binomial(n=10,p=0.2,size=(5,)) # X1, ..., X5 ~ B(10,0.2)
np.random.normal(loc=10,scale=2,size=(5,)) # X1, ..., X5 ~ N(10,4)
-
np.radom.randn(5)*2 + 10
와 같은코드
np.random.uniform(low=2,high=4,size=(5,)) # X1, ..., X5 ~ U(2,4)
-
np.random.rand(5)*2+2
와 같은 코드
np.random.poisson(lam=5,size=(5,)) # X1,...,X5 ~ Poi(5)
-
1차원
a=np.array([0,0,0,1,0])
a
np.where(a==1) # 조건 a==1을 만족하는 인덱스를 출력하라!
np.argwhere(a==1)
-
2차원
np.random.seed(43052)
a=np.random.randn(12).reshape(3,4)
a
np.where(a<0) # 조건을 만족하는 인덱스가 (1,2), (1,3), (2,0), (2,1), (2,3) 이라는 의미
np.argwhere(a<0) # 조건을 만족하는 인덱스가 (1,2), (1,3), (2,0), (2,1), (2,3) 이라는 의미
a[np.where(a<0)] # 조건을 만족하는 인덱스가 모두 출력 => 1차원 array로 출력
a[np.argwhere(a<0)] # 출력불가능
a[np.argwhere(a<0)[0][0],np.argwhere(a<0)[0][1]] # 어거지로 출력할수는 있음
-
np.where의 특수기능
np.random.seed(43052)
a=np.random.randn(12).reshape(3,4)
a
np.where(a<0,0,a) # a<0을 체크 => 조건에 맞으면 0 => 조건에 안맞으면 a
np.where(a<0,0,1) # a<0을 체크 => 조건에 맞으면 0 => 조건에 안맞으면 1
-
요약
- np.where: 인덱스의 좌표를 읽는 가독성은 떨어짐. 그런데 조건에 맞는 원소를 출력하거나 처리하는 (특수기능) 목적으로는 좋은 함수
- np.argwhere: 인덱스의 좌표를 읽는 가독성은 좋은 편임. 그런데 조건에 맞는 원소를 출력하거나 처리하는 기능은 떨어짐
-
원래 a는 2d array
a=np.arange(12).reshape(3,4)
a
-
경우1: 인덱싱 결과가 1d array로 나올수 있음
a[0,:] # 인덱싱의 결과 축의 갯수가 바뀐다! 2d array -> 1d array
-
경우2: 물론 인덱싱 결과가 2d array로 나올 수도 있음
a[[0,1],:] # 이것은 축의 숫자가 유지된다. 2d array -> 2d array
-
경우1의 상황에서도 축의 갯수를 유지하면서 인덱싱하려면?
a[[0],:] # 이번에는 인덱싱의 결과 축의 갯수가 유지된다! 2d array -> 2d array
a[:,[0]] #
-
미묘한 차이를 이해할것
a[0,:], a[[0],:]
a[:,0], a[:,[0]]
-
아래의 인덱싱을 비교하자.
a=np.arange(12).reshape(3,4)
a
a[0:2,0:2]
a[[0,1],0:2]
a[0:2,[0,1]]
-
언뜻 생각하면 위의 결과와 a[[0,1],[0,1]]
는 결과가 동일할 것 같다.
a[[0,1],[0,1]]
- 실제로는 [a[0,0],a[1,1]]이 array로 나옴
-
사실 np.where에서 이미 관찰하였음
a
np.where(a % 5 ==0)
a[np.where(a % 5 ==0)]
a[[0, 1, 2],[0, 1, 2]]
-
a[[0,1],[0,1]]이 a[0:2,0:2]를 의미하게 하려면 아래와 같이 하면 된다.
a[np.ix_([0,1],[0,1])] # 유용해보이지만 생각보다 잘 쓰이는건 아님
np.random.uniform(low=1.3,high=1.7,size=(10,))
위와 같은코드를 np.random.rand()를 이용하여 구현하라.