NumPy 기본

tabi·2023년 9월 8일
0

Python

목록 보기
1/2
post-thumbnail

NumPyNumerical Python의 약자로 다차원 배열을 다루는데 매우 효율적인 파이썬 라이브러리이다.

이 글에서는 NumPy 설치방법, NumPy의 특징과 함께 간단한 배열 생성 방법 및 연산에 대해 정리하고자 한다.

1. NumPy 설치하기

  • VSC(Visual Studio Code, 비주얼스튜디오코드) 사용자를 기준으로 한 설명입니다.

1. VSC에 NumPy를 설치하는 방법은 생각보다 간단하다.

  • VSC 터미널에 pip install numpy를 입력해준다.
  • 자동으로 NumPy가 install되며, 이후 VSC를 한 번 종료했다가 켜주면 NumPy가 잘 import된다.

2. NumPy?

  • NumPy는 다차원 배열 객체와 배열 연산을 위한 다양한 함수와 도구를 제공하여 수치 데이터를 효율적으로 다룰 수 있게 해주는 파이썬 라이브러리 이다.

2-1. 주요 특징

  1. 다차원 배열(Numpy Array): NumPy의 가장 중요한 데이터 구조는 다차원 배열인 ndarray이다. 이 배열은 모든 원소가 동일한 데이터 타입을 가지며, 다차원으로 구성된다. 이러한 배열은 행렬이나 텐서와 유사한 역할을 한다.
  2. 벡터화 연산: 배열 연산을 위한 함수와 연산자를 제공한다. 이를 통해 반복문 없이 배열의 모든 원소에 대한 연산을 수행할 수 있으며, 이러한 기능을 벡터화 연산이라고 한다.
  3. 브로드캐스팅: 다른 크기의 배열 간에도 연산이 가능하도록 브로드캐스팅이라는 기능을 제공하며 이를 통해 배열 간의 연산을 쉽게 수행할 수 있다.
  4. 선형 대수 및 통계 연산: NumPy는 선형 대수 연산(행렬 곱셈, 역행렬 등)과 통계 연산(평균, 분산, 표준편차 등)을 위한 다양한 함수를 제공한다.
  5. 난수 생성: 난수 생성 함수를 통해 난수를 생성할 수 있다.
  6. 파일 입출력: NumPy는 배열 데이터를 파일에 저장하고 로드하는 기능을 제공한다. 이를 통해 데이터를 영구적으로 보관하거나 다른 소프트웨어와 데이터를 공유할 수 있다.
  7. 인덱싱 및 슬라이싱: NumPy 배열은 다양한 인덱싱과 슬라이싱 기능을 제공하여 배열의 일부분에 쉽게 접근하고 조작할 수 있다.
  8. 속도 및 메모리 효율성: NumPy는 C 언어로 구현되어 있어 빠르고 메모리를 효율적으로 사용한다. 이는 대용량 데이터셋과 연산을 다룰 때 유리하다.

3. NumPy의 활용

3-1. 배열 생성하기

1. 1차원 배열

  • 0부터 3까지의 배열 생성하기
import numpy as np

array1 = np.arange(4) # [0 1 2 3] 의 배열 생성

2. 2차원 배열

  • 실수형 데이터 타입을 가지고, 0으로 초기화 된 4*4 크기의 2차원 배열 생성하기
import numpy as np

array2 = np.zeros((4, 4), dtype=float)

'''
 [[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
 의 배열 생성
'''
  • 문자형 데이터 타입을 가지고, 1로 초기화 된 3x3 크기의 2차원 배열 생성하기
import numpy as np

array2_1 = np.ones((3, 3), dtype=str)

'''
 [['1' '1' '1']
 ['1' '1' '1']
 ['1' '1' '1']]
 의 배열 생성
'''

3. 3차원 배열

  • 3x3x3 크기의 3차원 배열을 생성하고, 모든 요소를 '1'로 초기화
import numpy as np

array3d = np.ones((3, 3, 3), dtype=str)

print(array3d)

''' 출력
[[['1' '1' '1']
  ['1' '1' '1']
  ['1' '1' '1']]

 [['1' '1' '1']
  ['1' '1' '1']
  ['1' '1' '1']]

 [['1' '1' '1']
  ['1' '1' '1']
  ['1' '1' '1']]]
'''

4. 특수한 배열

  1. 랜덤배열
  • 정수형 데이터 타입을 가지고, 0부터 9까지 랜덤하게 초기화 된 3*3 크기의 2차원 배열 생성하기
import numpy as np

array_ran = np.random.randint(0, 10, (3, 3))

'''
 [[1 4 6]
 [2 4 8]
 [9 5 7]]
 의 배열 생성
'''
  1. 통계적으로 특정 분포를 따르는 배열
  • 평균이 0이고, 표준편차가 1인 표준 정규를 띄는 배열
import numpy as np

array_norm = np.random.normal(0, 1, (3, 3))

'''
[[-1.16249911  0.30251223  1.63606233] 
 [-1.05095362 -0.34898832 -0.77598991] 
 [-0.71999345 -0.81182158  0.93391068]]
 의 배열 생성
'''

3-2. 배열 활용하기

1. 배열 합치기

  • concatenate([합치려는 배열1, 합치려는 배열2])
import numpy as np

array1 = np.array([1,2,3])
array2 = np.array([4,5,6])
array3 = np.concatenate([array1, array2])

print(array3.shape) # (6,)
print(array3) # [1 2 3 4 5 6]

2. 배열 형태 바꾸기

  • 1차원 배열을 2차원 배열의 형태로 바꾸기
import numpy as np

array1 = np.array([1,2,3,4])
array2 = array1.reshape((2, 2))

print(array2.shape) # (6,)
print(array2) # [ [1, 2]
			  #   [3, 4] ]

3. 응용

  • 세로 축을 기준으로 배열 합치기
    • axis 값을 넣어준다.
import numpy as np

array1= np.arange(4).reshape(1, 4)
array2= np.arange(8).reshape(2, 4)

print(array1) # [[0, 1, 2, 3]]
print(array2) # [[0, 1, 2, 3]
			  # [4, 5, 6, 7]]
              
array3 = np.concatenate([array1, array2], axis=0)

print(array3) # [[0, 1, 2, 3]
			  #  [0, 1, 2, 3]
			  # [4, 5, 6, 7]]

4. 배열 나누기

  • 이차원 데이터를 좌, 우로 나누어보기
    • index=2인 열(3번째 열)을 기준으로 나누기
import numpy as np

array1= np.arange(8).reshape(2, 4)
left, right = np.split(array1, [2], axis=1)

print(left.shape) # (2, 2) 2x2 로 나뉨
print(right.shape) # (2, 2) 

print(array1) #  [0, 1, 2, 3]
			  # [4, 5, 6, 7]]

print(left) # [[0, 1]
			# [4, 5]]
print(right) # [[2, 3]
			# [6, 7]]

4. NumPy의 연산

  • NumPy는 배열에 대한 기본적인 사칙연산을 지원한다.

4-1. 상수연산

  • 상수 = 스칼라
  • NumPy는 어떠한 matrix에 대해 스칼라 연산을 수행하게 되면 각각의 원소에 값이 적용된다.

1. 더하기/빼기

  • 모든 각각의 원소에 +2, -2 가 된다.
import numpy as np

array1 = np.array([1,2,3,4])
#덧셈
array2 = array1 + 2
#뺄셈
array3 = array1 - 2

print(array2) # [3 4 5 6]
print(array3) # [-1 0 1 2]

2. 곱하기/나누기

  • 모든 각각의 원소에 *2, /2 가 된다.
import numpy as np

array1 = np.array([1,2,3,4])
#곱셈
array2 = array1 * 2
#나눗셈
array3 = array1 / 2

print(array2) # [2 4 6 8]
print(array3) # [0.5 1.  1.5 2. ]

4-2. 서로 다른 형태의 NumPy 연산

  • NumPy는 서로 다른 형태의 배열을 연산할 때는 행 우선으로 수행된다.

  • 일반적으로 행렬의 연산이란 동일한 형태의 행렬끼리의 연산을 의미하지만, NumPy의 경우 서로 다른 형태의 배열끼리 연산이 가능하다.

1. 브로드 캐스팅

  • 형태가 다른 배열을 연산할 수 있도록 배열의 형태를 동적으로 변환하는 것
  • 2*2 형태의 데이터와 1*2 형태의 데이터를 연산하는 경우 1*2 형태의 데이터의 크기가 2*2로 늘어나게 된다.
  • 이것을 브로드 캐스팅 이라고 한다.
import numpy as np

array1 = np.arange(4).reshape(2,2)
array2 = np.arange(2).reshape(1,2)

print(array1) # [[0 1]
              #  [2 3]]
print(array2) # [[0 1]]

result_array = array1 + array2

print(result_array) # [[0 2]
                    # [2 4]]

2. 마스킹 연산

  • 배열의 각 원소에 대해서 어떠한 조건을 만족하는지 체크하는 것
  • 2*4 형태의 데이터에 대해 5보다 작은 경우의 마스킹 연산을 수행하게 되면 True, False값을 가진 배열을 반환한다.
import numpy as np

array1 = np.arange(8).reshape(2,4)

boole = array1 < 5

print(array1) # [[0 1 2 3]
              # [4 5 6 7]]

print(boole) # [[ True  True  True  True]
             # [ True False False False]]
  • 기존 배열에 마스킹 연산을 수행한 배열을 넣게 되면, 해당 조건을 만족한 데이터에 대해서만 원하는 작업을 수행할 수 있다.
    • 반복문(for문)보다 효율적이다. 일일이 원소를 방문해 하나씩 조건문으로 처리하는 것보다 훨씬 빠르게 동작한다.
    • 활용예시: 이미지 처리를 수행함에 있어서 색상이 기준치 이상으로 밝은 픽셀값에 대한 변경사항 적용
array1[boole] = 100 # 10보다 작은 원소를 선택해 100으로 바꾼다
print(array1)

# [[100 100 100 100]
# [100   5   6   7]]

4-3. NumPy의 집계함수

  • 각 원소의 최대값, 최소값, 총합, 평균값 등을 빠르게 구할 수 있다.

1. 최대, 최소, 합, 평균 구하기

import numpy as np

array1 = np.arange(16).reshape(4,4)

print("최대값:", np.max(array1)) # 최대값: 15
print("최소값:", np.min(array1)) # 최소값: 0
print("합계:", np.sum(array1)) # 합계: 120
print("평균값:", np.mean(array1)) # 평균값: 7.5

2. 축(axis)을 기준으로 집계함수 계산하기

  • 각각의 열이나 행에 대한 집계함수를 구할수도 있다.

  • 예시: 각 열에 대해서 모든 행의 원소를 더한 값을 수행

import numpy as np

array1 = np.arange(16).reshape(4,4)

print(array1)
'''
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
'''

print("합계:", np.sum(array1, axis=0))
# 각 열을 기준으로 더한 값 출력
# 합계: [24 28 32 36]
profile
개발 공부중

0개의 댓글