파이썬/NumPy

NumPy - 3

잘잔디 2023. 4. 13. 17:54

정렬

a = np.array([[4,3,5,7],              
[1,12,11,9],             
[2,15,1,14]])
a
np.sort(a) # axis=-1 또는 axis=1 과 동일
np.sort(a, axis=0)

a.sort(axis=1) # a 값을 변화시킴
a

 

argsort를 활용한 sort 방식

a = np.array([42, 38, 12, 25])
j = np.argsort(a)
j

a[j]

np.sort(a)

고급 인덱싱 - 인덱스 배열을 사용한 인덱싱

a = np.array([[1,2],[3,4],[5,6]])
a

print(a[[0,1,2],[0,1,0]]) # a[0,0] a[1,1] a[2,0]을 인덱스로 하는 1차원 배열(shape=(3,))을 출력해준다.

a = np.array([[1,2],[3,4],[5,6]])
a

print(a[:,[0,1,0]])

기술 통계

  • 데이터의 개수
  • 평균
  • 분산
  • 편차
  • 최대/최솟값
  • 중앙값
  • 사분위수

데이터의 개수

x = np.array([18,5,10,23,19,-8,10,0,0,5,2,15,8,              
    2,5,4,15,-1,4,-7,-24,7,9,-6,23,-13])
len(x) #개수

표본 평균

np.mean(x) #평균

표본 분산

np.var(x) #분산

np.var(x, ddof=1) # 비편향 분산. 추후 공부하게 된다.

표준 편차

np.std(x) # 표준 편차

최댓값/최솟값

np.max(x) # 최대값

np.min(x) # 최소값

중앙값

np.median(x) # 중앙값

사분위수

np.percentile(x,0) # 최소값

np.percentile(x,25) # 1사분위수

np.percentile(x,50) # 2사분위수

np.percentile(x,75) # 3사분위수

np.percentile(x,100) # 4사분위수

난수 발생과 카운팅

시드 설정하기

  • 어떤 특정한 시작 숫자를 정해주면 컴퓨터가 정해진 알고리즘에 의해 마치 난수처럼 보이는 수열을 생성합니다.

이런 기준이 되는 시작 숫자를 시드라고 합니다.

  • 일단 생성된 난수는 다음번 난수 생성을 위한 시드값이 됩니다.

따라서 시드값은 한 번만 정해주면 됩니다.

np.random.seed(0) # 인수로는 0과 같거나 큰 정수를 넣어준다.
np.random.rand(5) # rand 함수는 0과 1사이의 난수를 발생시키는 함수다.

데이터의 순서 랜덤으로 바꾸기

x = np.arange(10)
x

np.random.shuffle(x) # 자체 변환 함수
x

데이터 샘플링

choice 함수는 다음과 같은 인수를 가질 수 있습니다.

numpy.random.choice(a, size=None, replace=True, p=None)

  • a : 배열이면 원래의 데이터, 정수이면 arrange(a) 명령으로 데이터 생성
  • size : 정수. 샘플 숫자.
  • replace : 불리언. True이면 한번 선택한 데이터를 다시 선택 가능.
  • p : 배열. 각 데이터가 선택될 수 있는 확률.

np.random.choice(5, 5, replace=False) # shuffle 명령과 같다.
np.random.choice(5, 3, replace=False) # 3개만 선택
np.random.choice(5,10) # 반복해서 10개 선택
np.random.choice(5, 10, p=[0.1, 0, 0.3, 0.6, 0]) # 선택 확률을 다르게 해서 10개 선택

난수 생성

  • rand : 0부터 1 사이의 균일 분포
  • randn : 표준 정규 분포
  • randint : 균일 분포의 정수 난수

rand

np.random.rand(3,5)

randn

  • 기댓값이 0이고 표준편차가 1인 표준 정규 분포를 따르는 난수를 생성합니다.
np.random.randn(10)

np.random.randn(3,5)

randint

  • numpy.random.randint(low, high=None, size=None)
  • 만약 high를 입력하지 않으면 0과 low 사이의 숫자를

np.random.randint(10, size=10)
np.random.randint(10, 20, size=10)
np.random.randint(10, 20, size=(3, 5))

정수 데이터 카운팅

np.unique([11,11,2,2,34,34])

a = np.array(['a', 'b', 'b', 'c', 'a'])
index, count = np.unique(a, return_counts=True)

index

count

np.bincount([1,1,2,2,2,3],minlength=6)

배열의 차원과 크기 알아내기

a = np.array([1,2,3])
print(a.ndim)
print(a.shape)

c = np.array([0,1,2],[3,4,5])
print(c.ndim)
print(c.shape)

print(d.ndim)
print(d.shape)

배열의 인덱싱

a = np.array([_ for _ in range(5)])
a

a = np.array([[0,1,2], [3, 4, 5]])
a

a[-1,-1] # 마지막 행의 마지막 열

배열의 슬라이싱

a = np.array([[0,1,2,3], [4, 5, 6, 7]])
a

np.array([_ for _ in range(8)]).reshape(2,4)

a[0,:] # 첫번째 행 전체

a[:,1] # 두번째 열 전체

a[1,1:] # 두번째 행의 두번째 열부터 끝열까지

a[:2,:2]

동전을 100번 던진 결과를 넘파이에 난수를 발생시켜서 시뮬레이션해보려 합니다.

  • 앞면을 숫자 1, 뒷면을 숫자 0으로 가정하고 난수를 발생시켜 보세요.
  • 이때 앞면이 나올 확률을 구하는 프로그램을 구현해 보세요.
  • (seed는 0으로 합니다.)

np.random.seed(0)
coin_result = np.random.choice(2,100)
coin_result.sum()/len(coin_result)

주사위는 1부터 6까지의 숫자를 가집니다.

  • 이 주사위를 100번 던져서 나오는 숫자를 넘파이 난수를 발생시켜서 시뮬레이션하고 나오는 숫자의 평균을 구해보세요.
  • (seed는 0으로 설정합니다.)

np.random.seed(0)
dice_result = np.random.randint(1,7, size=100)
np.mean(dice_result)