함께하는 데이터 분석

[Python] NumPy 본문

데이터분석 공부/Python

[Python] NumPy

JEONGHEON 2022. 1. 23. 16:04

안녕하세요!

오늘은 파이썬에서 다차원 배열을 효과적으로 처리할 수 있고

수학 및 과학 연산에 유용한 NumPy 라이브러리에 대해 알아보려고 합니다.

우선 코딩은 주피터 노트북을 활용했습니다!

만약 주피터 노트북을 이용하고 싶으시다면

2022.01.22 - [데이터 분석 공부하기/Python] - [Python] Jupyter Notebook 설치 및 실행

 

[Python] Jupyter Notebook 설치 및 실행

오늘은 간단하게 Anaconda를 설치하여 주피터 노트북을 실행시키는 방법을 알아볼게요! 우선 아나콘다는 수학과 과학 분야에서 사용되는 여러 패키지들을 묶어 놓은 파이썬 배포판이고 대표적으

tnqkrdmssjan.tistory.com

^^^^
여기를 눌러주시면 됩니다!

그럼 시작해볼게요~

 

1. NumPy 배열

import numpy as np #numpy 불러오기 

ar = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
ar 
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

type(ar) 
>>> numpy.ndarray

 

1-1. 1차원 배열 만들기

ar1 = np.array([1, 2, 3]) 
ar1 
>>> array([1, 2, 3]) 

print(ar1.ndim) # 배열의 차원 
print(ar1.shape) # 배열의 크기 
>>> 1 
    (3,)

 

1-2. 2차원 배열 만들기

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

print(ar2.ndim) # 배열의 차원 
print(ar2.shape) # 배열의 크기 (행, 열) 
>>> 2 
    (2, 3)

 

1-3. 3차원 배열 만들기

# 2 x 3 x 4 array
ar3 = np.array([[[1, 2, 3, 4],
                 [5, 6, 7, 8], 
                 [9, 10, 11, 12]], 
                [[11, 12, 13, 14], 
                 [15, 16, 17, 18], 
                 [19, 20, 21, 22]]]) 
ar3 
>>> array([[[ 1, 2, 3, 4], 
            [ 5, 6, 7, 8], 
            [ 9, 10, 11, 12]], 
     
           [[11, 12, 13, 14], 
            [15, 16, 17, 18], 
            [19, 20, 21, 22]]]) 

print(ar3.ndim) # 배열의 차원 
print(ar3.shape) # 배열의 크기 (깊이, 행, 열) 
>>> 3 
    (2,3,4)

 

1-4. 배열의 자료형

ar1 = np.array([1, 2, 3]) 
ar1.dtype # 배열 원소의 타입 
>>> dtype('int32') 

ar2 = np.array([1.0, 2.0, 3.0]) 
ar2.dtype 
>>> dtype('float64') 

ar3 = np.array([1, 2, 3], dtype = 'f') #float으로 설정 
ar3.dtype 
>>> dtype('float32')

 

2-1. 배열의 인덱싱

# 1차원 배열 
ar1 = np.array([0, 1, 2, 3, 4]) 
ar1
>>> array([0, 1, 2, 3, 4]) 

ar1[2] #파이썬은 0번째부터 
>>> 2 

ar1[-1] #맨 뒤 
>>> 4 

# 2차원 배열 
ar2 = np.array([[0, 1, 2], [3, 4, 5]]) 
ar2 
>>> array([[0, 1, 2], 
           [3, 4, 5]]) 

ar2[0, 1] # 첫 번째 행의 두 번째 열 
>>> 1 

ar2[-1, -1] # 마지막 행의 마지막 열 
>>> 5

 

2-2. 배열 슬라이싱

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

# 첫 번째 행 전체 
ar1[0, :] 
>>> array([0, 1, 2, 3]) 

# 두 번째 열 전체 
ar1[:, 1] 
>>> array([1, 5]) 

# 두 번째 행의 두 번째 열부터 끝 열까지 
ar1[1, 1:] 
>>> array([5, 6, 7])

 

2-3. 배열 인덱싱(팬시 인덱싱)

# 1차원 배열에서 홀수번째 원소만 추출 
ar = np.array([11, 22, 33, 44, 55, 66, 77, 88, 99]) 
idx = np.array([0, 2, 4, 6, 8]) 
ar[idx] 
>>> array([11, 33, 55, 77, 99]) 

# 같은 원소를 반복하여 출력 가능 
ar = np.array([11, 22, 33, 44, 55, 66, 77, 88, 99]) 
idx = np.array([0, 0, 0, 0, 1, 1, 1, 1]) 
ar[idx] 
>>> array([11, 11, 11, 11, 22, 22, 22, 22]) 

# 조건문 연산을 사용하여 원소 추출 
ar = np.array([11, 22, 33, 44, 55, 66, 77, 88, 99]) 
ar[ar % 2 == 0] # 2로 나눠서 나머지가 0 
>>> array([22, 44, 66, 88]) 

# 다차원 배열에서 배열 인덱싱 
ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) 
ar 
>>> array([[ 1, 2, 3, 4], 
           [ 5, 6, 7, 8], 
           [ 9, 10, 11, 12]]) 

ar[:, [True, False, False, True]] 
>>> array([[ 1, 4], 
           [ 5, 8], 
           [ 9, 12]]) 

ar[[2, 0, 1], :] # 행 순서 변경 
>>> array([[ 9, 10, 11, 12], 
           [ 1, 2, 3, 4], 
           [ 5, 6, 7, 8]])

 

3. 배열 생성 함수

# 모든 원소가 0인 배열 생성 
ar1 = np.zeros(5) 
ar1 
>>> array([0., 0., 0., 0., 0.]) 

ar2 = np.zeros((2, 3)) 
ar2 
>>> array([[0., 0., 0.], 
           [0., 0., 0.]]) 

# 모든 원소가 1인 배열 생성 
ar3 = np.ones((3, 4), dtype = 'int') # int설정 
ar3 
>>> array([[1, 1, 1, 1], 
           [1, 1, 1, 1], 
           [1, 1, 1, 1]]) 

# 특정 규칙에 따라 증가하는 수열 생성 
np.arange(10) 
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

np.arange(1, 10, 2) # 시작, 끝(포함), 구간
>>> array([1, 3, 5, 7, 9]) 

np.linspace(0, 100, 5) # 시작, 끝(포함), 개수 
>>> array([ 0., 25., 50., 75., 100.])

 

4-1. 배열의 크기 바꾸기

ar1 = np.arange(12) #0부터 12개 생성 
ar1 
>>> array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 

ar2 = ar1.reshape(3, 4) 
ar2 
>>> array([[ 0, 1, 2, 3], 
           [ 4, 5, 6, 7], 
           [ 8, 9, 10, 11]])

 

4-2. 배열 합치기

# 가로로 합치기  
ar1 = np.array([1, 2, 3]) 
ar2 = np.array([4, 5, 6]) 
ar3 = np.concatenate([ar1, ar2]) 
ar3 
>>> array([1, 2, 3, 4, 5, 6]) 

# 세로로 합치기 ar1 = np.arange(4).reshape(1, 4) 
ar2 = np.arange(8).reshape(2, 4) 
print(ar1, "\n") 
print(ar2) 
>>> [[0 1 2 3]] 
     
    [[0 1 2 3] 
     [4 5 6 7]]

ar3 = np.concatenate([ar1, ar2], axis = 0) ar3 
>>> array([[0, 1, 2, 3], 
           [0, 1, 2, 3], 
           [4, 5, 6, 7]])

 

4-3. 정렬

ar1 = np.array([5, 9, 10, 3, 1]) 
ar1 = np.sort(ar1) # 오름차순 
ar1 
>>> array([ 1, 3, 5, 9, 10]) 

# 내림차순 - sort함수는 내림차순 지원을 안해서 오름차순 정렬 후 아래와 같이 진행 
ar1[::-1] 
>>> array([10, 9, 5, 3, 1]) 

ar2 = np.array([[4, 3, 5, 7], 
                [1, 12, 11, 9], 
                [2, 15, 1, 14]]) 
ar2 
>>> array([[ 4, 3, 5, 7], 
           [ 1, 12, 11, 9], 
           [ 2, 15, 1, 14]]) 

np.sort(ar2, axis = 0) # axis=0 -> 열 
>>> array([[ 1, 3, 1, 7], 
           [ 2, 12, 5, 9], 
           [ 4, 15, 11, 14]]) 

np.sort(ar2, axis = 1) # axis=1 -> 행 
>>> array([[ 3, 4, 5, 7], 
           [ 1, 9, 11, 12], 
           [ 1, 2, 14, 15]])

 

5. 기술통계

ar = np.array([18, 5, 10, 23, 12, 7, 2, 15, 8, 6]) 
ar 
>>> array([18, 5, 10, 23, 12, 7, 2, 15, 8, 6]) 

len(ar) # 데이터의 개수 
>>> 10 

np.mean(ar) # 평균 
>>> 10.6 
 
np.var(ar) # 분산
>>> 37.64 
 
np.std(ar) # 표준편차
>>> 6.135144660071187 

np.max(ar) # 최대값 
>>> 23 

np.min(ar) # 최소값 
>>> 2 

np.median(ar) # 중앙값 
>>> 9.0 

print(np.percentile(ar, 25)) # 1사분위수 
print(np.percentile(ar, 50)) # 2사분위수 (median) 
print(np.percentile(ar, 75)) # 3사분위수 
>>> 6.25 
    9.0 
    14.25

 

6-1. 난수생성

# 시드 설정하기
np.random.seed(1234) 

np.random.rand(5) # 0과 1사이의 난수 5개 생성 
>>> array([0.19151945, 0.62210877, 0.43772774, 0.78535858, 0.77997581]) 

np.random.randn(10) # 표준정규분포를 따르는 난수 10개 생성 
>>> array([-0.94029827, -0.95658428, -0.33060682, 0.87412791, 2.00254961, 
            0.01086208, -0.86924706, 1.4249841 , 0.1458091 , 2.89409095]) 

np.random.normal(3, 1, 10) #평균이 3 표준편차가 1을 따르는 난수 10개 생성 
>>> array([3.47143516, 1.80902431, 4.43270697, 2.6873481 , 2.27941127, 
           3.88716294, 3.85958841, 2.3634765 , 3.01569637, 0.75731505]) 

np.random.randint(10, 20, size = 10) # 시작, 끝, 개수 
>>> array([15, 12, 16, 13, 17, 10, 19, 10, 13, 12]) 

np.random.randint(10, 20, size = (3, 4)) 
>>> array([[13, 11, 13, 11], 
           [13, 17, 11, 17], 
           [14, 10, 15, 11]])

 

6-2. 데이터 순서 바꾸기

ar = np.arange(10) 
np.random.shuffle(ar) 
ar 
>>> array([7, 2, 3, 8, 6, 1, 0, 9, 4, 5])

 

7. 정수 데이터 카운팅

# 중복된 원소 제거 
ar1 = np.array([1, 1, 2, 2, 2, 3, 3, 4]) 
np.unique(ar1) 
>>> array([1, 2, 3, 4]) 

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

index #중복 원소 제거된 array 
>>> array(['a', 'b', 'c'], dtype='<U1') 

count #원소의 갯수 
>>> array([4, 2, 3], dtype=int64)

이상입니다!

다음은 Pandas로 찾아뵐게요!