라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목파이썬 패키지 : NumPy2022-03-03 03:18
작성자user icon Level 4
첨부파일NumPy.ipynb.zip (4.8KB)

88x31.png


머신러닝을 배우기전에 기초가 되는 라이브러리를 알아보도록 하겠습니다.

이번 글에서는 NumPy 패키지에 대해 알아보겠습니다.


첨부파일은 NumPy를 정리한 주피터 노트북 파일(NumPy.ipynb)입니다.

해당 확장자를 첨부할 수 없어서 zip 파일로 압축해 두었습니다.


NumPy는 C언어로 구현된 파이썬 라이브러리로써, 파이썬의 내장 타입인 리스트보다 데이터의 저장 및 처리에 있어 효율적인 행렬/배열을 제공합니다. 데이터분석을 할 때 사용되는 라이브러리인 pandas와 matplotlib 및 sklearn의 기반으로 사용되기도 합니다.


주피터 노트북을 통해 코드를 작성해보겠습니다.

 $ cd ~/ml_ws && conda activate ml_py39

 (ml_py39) $ jupyter notebook


오른쪽 상단에 New를 누르고 Python3을 클릭하면 작업공간에 파일이 하나 생성되고 코드 작성화면이 나옵니다.

mb-file.php?path=2022%2F03%2F02%2FF4617_1.png
 

주피터 노트북은 셀단위로 구성되어 있습니다. 1번째 셀에 다음 코드를 입력하여 numpy 모듈을 import합니다. 별칭으로 np를 지정해줍니다.

import numpy as np

mb-file.php?path=2022%2F03%2F02%2FF4618_2.png
 

초록색으로 표시되는 것은 입력모드라는 뜻입니다. 실행모드에서는 파란색으로 표시됩니다.

shift + 엔터를 누르면 해당셀의 스크립트가 실행되고 다음 셀이 생성됩니다.



1. 배열(array) 생성


배열은 array 함수를 통해 생성할 수 있습니다. 내장함수 리스트(list)와 달리 동질의 데이터를 다룰 수 있습니다.

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

mb-file.php?path=2022%2F03%2F02%2FF4619_3.png 


매개변수 dtype을 통해 타입을 설정할 수도 있습니다.

np.array([1,2,3,4,5], dtype=float)

mb-file.php?path=2022%2F03%2F02%2FF4620_4.png 


리스트 컴프리헨션(list comprehension)을 통해 배열을 생성할 수도 있습니다.

np.array([i*2 for i in range(5)])

mb-file.php?path=2022%2F03%2F02%2FF4621_5.png
 

zeros 함수를 통해 영행렬을 생성할 수 있습니다.

np.zeros(5, dtype=int)

mb-file.php?path=2022%2F03%2F02%2FF4622_6.png
 

ones 함수를 통해서는 유닛행렬을 생성할 수 있습니다. 숫자대신 튜플을 입력하면 다차원 행렬을 생성합니다.

np.ones((3, 3), dtype=int)

mb-file.php?path=2022%2F03%2F02%2FF4623_7.png
 

다른 숫자로 행렬을 생성하려면 full 함수를 사용합니다. 두번째 매개변수로 생성할 숫자를 입력합니다.

np.full((3, 3), 5, dtype=int)

mb-file.php?path=2022%2F03%2F02%2FF4624_8.png
 

범위를 지정하여 배열을 생성하려면 arange 함수를 사용합니다. 내장함수 range와 사용법이 같습니다. 첫번째 매개변수로 시작숫자를, 2번째 매개변수로 끝숫자를, 3째 매개변수로 스텝을 입력합니다. 끝숫자는 배열에 포함되지 않습니다.

np.arange(5, 0, -1)

mb-file.php?path=2022%2F03%2F02%2FF4625_9.png
 

linspace 함수를 통해 범위를 일정한 간격으로 나누어 배열을 생성할 수도 있습니다. 첫번째 매개변수로 시작숫자를, 2번째 매개변수로 끝숫자를, 3번째 매개변수로 개수를 입력합니다. arange 함수와 달리 끝숫자는 배열에 포함됩니다.

np.linspace(0, 100, 5, dtype=int)

mb-file.php?path=2022%2F03%2F02%2FF4626_10.png
 


2. 난수 생성


난수를 생성하기 위해서는 random 함수를 사용합니다. 0 ~ 1 사이의 숫자를 랜덤으로 생성합니다.

np.random.random((3, 3))

mb-file.php?path=2022%2F03%2F02%2FF4627_11.png
 

정수형으로 난수를 생성하려면 randint 함수를 사용하면 됩니다. 첫번째 매개변수로 시작숫자를, 2번째 매개변수로 끝숫자를, 3번째 매개변수로 배열크기를 입력받습니다. 끝숫자는 배열에 포함되지 않습니다.

np.random.randint(0, 100, (3, 3))

mb-file.php?path=2022%2F03%2F02%2FF4628_12.png
 

정규분포로부터 난수를 생성하려면 normal 함수를 사용합니다. 첫번째 매개변수로 평균값, 2번째 매개변수로 표준편차, 3번째 매개변수로 배열크기를 입력받습니다.

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

mb-file.php?path=2022%2F03%2F02%2FF4629_13.png
 

난수는 스크립트를 실행할때마다 변경되기때문에 재현성에 문제가 있습니다. 이를 해결하기 위해서 seed 함수를 사용합니다. 매개변수는 임의의 숫자를 입력하면 됩니다.

np.random.seed(0)

np.random.randint(0, 100, (3, 3))

mb-file.php?path=2022%2F03%2F02%2FF4630_14.png 

스크립트를 다시 실행시켜 보세요. 값이 변하지 않습니다.



3. 인덱싱(Indexing)


배열 인덱싱은 리스트 인덱싱과 비슷합니다. 우선 배열을 2개 만듭시다.

arr = np.arange(10)

arr2 = np.random.randint(0, 100, (3, 3))


단일 인덱싱은 다음과 같습니다. 대괄호 안에 index를 입력합니다.

arr[2]


음수는 오른쪽에서 왼쪽으로 인덱싱 됩니다. 그러므로 -1을 입력하면 마지막 원소가 출력됩니다.

arr[-1]


다차원 배열의 경우 대괄호안에 콤마로 구분하여 인덱싱 할 수 있습니다.

arr2[0, 1] # arr2[0][1]과 동일



4. 슬라이싱(Slicing)


슬라이싱도 마찬가지로 리스트와 비슷합니다. arr[시작:끝:스텝] 형식으로 작성합니다. 끝번호 원소는 포함되지 않습니다.

arr[2:8:2] # [2, 4, 6] 출력


스텝의 생략은 가능합니다.

arr[3:5] # [3, 4] 출력


시작을 생략하면 첫번째 원소부터 시작되고, 끝을 생략하면 마지막 원소까지 슬라이싱 합니다.

arr[:5] # [0, 1, 2, 3, 4] 출력

arr[6:] # [6, 7, 8, 9] 출력


스텝이 음수이면 오른쪽에서 왼쪽으로 슬라이싱 합니다.

arr[:7:-1] # [9, 8] 출력


다차원 배열의 슬라이싱도 가능합니다.

arr2[1:3, 1:3]


리스트 컴프리헨션(list comprehension) 사용도 가능합니다.

arr[[i for i in [2,4,7]]]



5. 배열 객체의 형태 변경과 연결


배열 객체의 형태를 변경하려면 reshape 함수를 사용합니다.

list1 = np.arange(1, 13).reshape((3, 4))

mb-file.php?path=2022%2F03%2F03%2FF4631_15.png
 

튜플의 행 숫자에 -1을 넣으면 원소 개수에서 혈 숫자로 나눈 수가 입력됩니다.

list2 = np.arange(13, 25).reshape((-1, 4))

mb-file.php?path=2022%2F03%2F03%2FF4632_16.png
 

배열 객체의 연결은 concatenate 함수를 사용합니다.

np.concatenate([list1, list2])

mb-file.php?path=2022%2F03%2F03%2FF4633_17.png

매개변수 axis를 통해 방향을 설정할 수도 있습니다. 기본값은 0이고, 행방향으로 연결합니다. axis를 1로 설정하면 열방향으로 연결합니다.

np.concatenate([list1, list2], axis=1)

mb-file.php?path=2022%2F03%2F03%2FF4634_18.png
또한 vstack 함수를 통해 행방향으로, hstack 함수를 통해 열방향으로 연결가능합니다.

np.vstack([list1, list2])

np.hstack([list1, list2])

mb-file.php?path=2022%2F03%2F03%2FF4635_19.png 



6. 범용함수(ufunc)


numpy 배열 객체는 수처리와 관련하여 내장된 범용함수가 있습니다. 이 함수들은 벡터값 처리를 가능하도록 해줍니다.


우선 배열의 합은 sum 함수를 사용합니다.

list1.sum()

mb-file.php?path=2022%2F03%2F03%2FF4637_20.png
 

다음과 같이 numpy 모듈을 사용해도 됩니다. 

np.sum(list1)

mb-file.php?path=2022%2F03%2F03%2FF4638_21.png

매개변수 axis를 설정하면 축방향으로 더하는 것이 가능합니다. axis가 0이면 행방향, 1이면 열방향으로 더합니다.

list1.sum(axis=0)

mb-file.php?path=2022%2F03%2F03%2FF4640_24.png 

mb-file.php?path=2022%2F03%2F03%2FF4639_22.png
 

list1.sum(axis=1)

mb-file.php?path=2022%2F03%2F03%2FF4641_25.png
mb-file.php?path=2022%2F03%2F03%2FF4642_23.png
 

최소값은 min, 최대값은 max 함수를 사용하며, 마찬가지로 매개변수 axis의 설정이 가능합니다.

list1.min(), list1.max()

mb-file.php?path=2022%2F03%2F03%2FF4643_26.png
 

평균값은 mean 함수를 사용합니다.

list1.mean()

mb-file.php?path=2022%2F03%2F03%2FF4644_27.png
 


7. 브로드캐스팅(Broadcasting)


일정 조건에 부합하다면 배열의 형태가 서로 달라도 연산을 수행할 수 있습니다.


조건은 다음과 같습니다.

(1) 두 축의 형태가 동일합니다.

(2) 한개 이상의 축의 크기가 1이고 나머지 축의 크기는 동일합니다.


둘 중 하나의 조건에 해당하기만 하면 됩니다.


list1 배열의 형태는 (3, 4) 입니다.

mb-file.php?path=2022%2F03%2F03%2FF4645_28.png


(3, 1) 형태의 배열 list3을 생성해보겠습니다.

mb-file.php?path=2022%2F03%2F03%2FF4646_29.png

list3은 행의 크기가 list1과 같고 열의 크기가 1이므로, 두 배열을 연산할때 브로드캐스팅이 일어납니다.
list3은 브로드캐스팅에 의해 다음과 같이 복제되어 (3, 4) 형태가 됩니다.

mb-file.php?path=2022%2F03%2F03%2FF4647_30.png
 

실제로 더해봅시다.

list1 + list3

mb-file.php?path=2022%2F03%2F03%2FF4648_31.png
 

8. 부울 배열과 마스킹  연산


배열의 조건식을 통해 부울 배열을 만들 수 있습니다. 우선 (3, 4) 형태의 난수 배열 X를 만듭시다.

mb-file.php?path=2022%2F03%2F03%2FF4649_32.png
 

배열을 사용하여 조건식을 작성하면 다음과 같이 조건에 맞는 부울 배열이 생성됩니다.

mb-file.php?path=2022%2F03%2F03%2FF4650_33.png


부울 배열을 통해 마스킹 연산이 가능합니다. 해당 조건에 맞는 값만 연산에 사용됩니다.

mb-file.php?path=2022%2F03%2F03%2FF4651_34.png 

#NumPy
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)