본문 바로가기

순이코딩/Python

[Python] 파이썬 라이브러리 - NumPy Library

728x90
반응형

 


 

1. 라이브러리 기초

 

■ 모듈(Module)

 

모듈은 여러 함수들이 모여있는 파이썬 파일(.py)입니다. 파이썬에 기본적으로 내장되어 있는 모듈은 내장모듈, 이용자가 직접 만들어 외부로 내보낸 파일을 외부 모듈이라고 합니다.

def add(*args) :
    re = sum(args)
    return re

이런 식으로 함수를 만들어 함수들을 담은 파일은 파이썬 파일로 내보낸다면 아래 그림처럼 모듈을 불러와 모듈 안에 있는 함수의 기능을 사용할 수 있습니다.

import 모듈 as 줄임말 
# 줄임말은 필수는 아니지만 모듈이름이 긴 경우 사용에 불편하기 때문에 줄여씁니다

 

■ 패키지(Package)

 

패키지는 여러 모듈(.py파일)을 포함하고 있는 디렉터리입니다.

 

■ 라이브러리(Library)

 

라이브러리는 위에서 이야기한 여러 패키지와 모듈을 포함하는 코드 모음입니다.

패키지와 라이브러리 또한 모듈처럼 import를 사용해 불러와 안에 있는 함수를 사용할 수 있습니다.

 


 

2. NumPy Library

 

NumPy는 Numerical Python의 약자로 파이썬에서 수치계산을 위한 핵심 라이브러리입니다. 넘파이는 ndarray(N-dimensional array) 자료구조를 지원합니다.

ndarray는 리스트와 튜플 등과는 다르게 동일한 자료형을 가지는 값들만 들어갈 수 있고 배열 형태로 존재합니다.

 

■ ndarray 생성하기

 

ndarray 생성은 2가지 방법이 있습니다. 먼저 리스트 데이터를 ndarray로 형변환 하는 방법이고, 두 번째는 직접 ndarray화로 생성하는 방법입니다.

# list 생성
list1 = [1,2,3,4,5]

# array 생성
arr1 = np.array(list1)
type(arr1)

 

이렇게 리스트를 생성한 후 형변환을 하면 데이터 타입을 확인했을 때 numpy.ndarray임을 볼 수 있습니다.

두 번째 방법은 단순히 위의 코드에서 np.array() 안에 들어가는 내용을 미리 생성해 둔 리스트 변수명이 아니라 직접 리스트를 넣는 방법입니다. 다음과 같이 생성할 수 있습니다.

arr2 = np.array([6,7,8,9,10])

2차원 ndarray도 생성방법은 같습니다. 마찬가지로 2차원 리스트를 생성해 형변환을 할 수도 있고 직접 생성할 수 있습니다. 여기서 2차원 ndarray와 리스트의 차이를 확연히 볼 수 있습니다.

 

이렇게 ndarrary는 배열의 형태로 존재함을 볼 수 있습니다.

 

■ ndarray 확인하기

 

ndarray의 속성을 볼 수 있는 함수들이 있습니다.

함수이름 설명
.ndim ndarray의 차원 수 확인하기
.shape ndarray의 모양(크기) 확인하기
.dtype ndarray의 데이터 타입 확인하기
.size ndarray의 전체 요소 개수 확인하기
print(array)
print("ndim(차원수) : ", arr3.ndim)
print("shape(모양) : ", arr3.shape)
print("dtype(데이터타입) : ", arr3.dtype)
print("size(요소 전체 개수) : ", arr3.size)

 

위 그림과 같이 ndarray가 배열의 형태로 출력된 것을 볼 수 있고, 차원수는 2, 모양(행, 열)은 (2,3) 데이터타입은 int32, 요소의 전체 개수는 6이라고 나온 것을 볼 수 있습니다.

 

데이터 타입을 변경하는 데는 두 가지 방법이 있습니다. 리스트를 ndarray화 할 때 데이터 타입을 지정해 주는 방법과 함수를 사용하는 방법입니다.

list3 = [[1.7,4.2,4.6],[3.1,2.9,5.8]]
temp1 = np.array(list3, dtype = np.int64)

array_info(temp1)

이렇게 실수로 이루어진 2차원 리스트를 생성한 후 tmep1을 ndarray화 시키면서 dtype = np.int64로 데이터 타입을 지정해주고 있습니다.

 

실제 ndarray의 정보를 확인해 보면 실수 데이터가 모두 소수점은 버리고 정수 데이터로 ndarray에 담겨있고 데이터타입은 int64인 것을 볼 수 있습니다.

데이터 타입을 변경하는 함수는 다음과 같습니다.

# 기본형
array명.astype(np.데이터타입)

# 변환
temp1 = temp1.astype(np.float64)
array_info(temp1)

 

이번에는 정수 데이터들이 소수점 .0을 생성한 채로 ndarray에 담기고 데이터타입이 float64로 변경된 것을 볼 수 있습니다.

마지막으로 ndarray의 행, 열을 바꾸겠습니다. 지금 temp1의 ndarray는 (2,3)의 크기입니다. 행과 열의 값이 맞게 떨어져야 하므로 (1,6), (2,3), (3,2), (6,1) 4가지 경우로 변환할 수 있습니다.

# array명.reshape(행, 열)

temp1 = temp1.reshape(3,2)
array_info(temp1)

 

2행 3열의 ndarray가 3행 2열로 변했습니다.

 

■ 특정한 값으로 ndarray 생성하기

 

ndarray를 생성하는 또 다른 방법입니다. 이 특정 값으로 생성하는 방법에는 6가지가 있습니다.

함수 이름 설명
np.zeros((행, 열)) 모든 값을 0으로 초기화 한 ndarray 생성 (기본 데이터 형 : float)
np.ones((행, 열)) 모든 값을 1으로 초기화 한 ndarray 생성 (기본 데이터 형 : float)
np.full((행, 열), 값) 모든 값을 원하는 값으로 초기화 한 ndarray 생성
np.arange(시작값, 끝값, 증감량) 정해진 범위 안의 정수를 담은 1차원 ndarray 생성
np.random.rand(행,열) 모든 값을 랜덤값으로 ndarray 생성
np.random.randint(시작값, 끝값, size=(행, 열)) 정해진 범위 안에서 랜덤으로 정수형 ndarray 생성(끝값 포함 X)
arr_zero = np.zeros((2,4))
arr_one = np.ones((2,4))
arr_full = np.full((2,4),5)
arr_arange = np.arange(1,5,1)
arr_ran = np.random.rand(2,4)
arr_random = np.random.randint(1,11,size=(2,4))

 

위의 코드를 실행했을 때, 아래와 같이 ndarray가 생성되었음을 볼 수 있습니다.

 

 

ndarray 연산

 

ndarray의 연산은 요소별 연산에 특화되어 있습니다. 브로드캐스팅 기능이 있어 차원수를 자동으로 맞춰주기 때문입니다. 이전에 리스트끼리 연산을 할 경우에는 리스트가 이어졌는데 ndarray의 경우에는 요소별 연산이 가능합니다.

list1,list2 = [1,2,3],[4,5,6]

arr_a,arr_b = np.array(list1),np.array(list2)

print(arr_a+arr_b)

 

이렇게 같은 열의 요소끼리 연산이 되었음을 볼 수 있습니다. 아래와 같이 2차원 ndarray도 차원을 인식해 요소별 연산이 되었고, 곱셈도 연산이 잘되는 것을 볼 수 있습니다.

 

 

ndarray 인덱싱 & 슬라이싱

 

ndarray도 인덱싱과 슬라이싱 방법은 리스트, 튜플 형과 방법은 같습니다.

인덱싱은 [행값, 열값], 슬라이싱은 [행의 시작값:행의 끝값, 열의 시작값:열의 끝값] 이러한 형태로 할 수 있습니다.

# 1~50까지, 5행 10열의 ndarray생성
arr2 =np.arange(1,51).reshape(5,10)

print(arr2,'\n\n')
print(arr2[2:5,0:9])
print(arr2[2:,:9])

 

행 부분은 2:5이므로 2행부터 4행까지이고, 열 부분은 0:9이므로 0행부터 8행까지 잘 출력되었습니다. 

arr2[2:5,0:9]
arr2[2:,:9]

두 슬라이싱은 똑같은 결과를 보이고 있습니다. 행은 2행부터 끝까지 이므로 생략이 가능해 생략을 했고, 마찬가지로 열은 처음부터 8열까지이므로 시작 값이 생략되었습니다. 만약 9열까지 출력하려고 했다면 다음 코드와 같이 전체 생략이 가능합니다.

arr2[2:]

# array[행 시작값:행 끝값{,열 시작값:열의 끝값}] --> {}부분 생략가능!

 

Boolean 인덱싱

 

Boolean 인덱싱은 배열 안에서 조건을 충족(특정 조건을 만족)하는 True인 값들만 추출하는 인덱싱입니다. 간단히 말하자면 "필터링"이라고 할 수 있습니다.

score = np.array([80,75,55,96,30])

다음과 같은 ndarray를 생성하고 80점 이상인 데이터만 추출하고 싶다면 boolean mask로 전환해 할 수 있습니다.

mask = score >= 80
print(score[mask])

 

boolean mask로 전환하면 위 이미지에서 보듯 mask는 값들이 조건에 맞춰 boolean 데이터 타입으로 전환되고 그중 True값들만 추출하고 있습니다.

 

■ array 연산 함수

 

arr = np.random.randint(1,10,size=(2,5))

print(arr)
print(sum(arr)) # 파이썬에서 제공하는 내장함수

print(np.sum(arr)) # numpy에서 제공하는 sum 함수

 

위의 코드를 봤을 때 파이썬에서 제공하는 내장함수 sum()은 각 열끼리의 합을 연산하고 있습니다. 그러나 이와 다르게 numpy에서 제공하는 sum() 함수는 모든 요소의 합을 더하고 있음을 볼 수 있습니다.

이처럼 numpy에서 제공하는 다양한 수학적 함수가 있습니다.

 

※ 단일 배열에 사용하는 함수

함수이름 설명
abs, fabs 각 원소의 절대값을 구한다. 복소수가 아닌 경우에는 fabs로 빠르게 연산가능
sqrt 제곱근을 계산 arr**0.5와 동일
square 제곱을 계산 arr**2와 동일
Exp 각 원소에 지수 eₓ를 계산
Log,log10, log2, logp 각각 자연로그, 로그10, 로그2, 로그(1+x)
sign 각 원소의 부호를 계산
ceil 각 원소의 소수자리 올림
floor 각 원소의 소수자리 버림
rint 각 원소의 소수자리 반올림, dtype 유지
modf 원소의 몫과 나머지를 각각 배열로 반환
isnan 각 원소가 숫자인지 아닌지 NaN 나타내는 불리언 배열
isfinite, isinf 배열의 각 원소가 유한한지 무한한지 나타내는 불리언 배열
cos,cosh, sin, sinh, tan, tanh 일반 삼각함수와 쌍곡삼각 함수
logical_not 각 원소의 논리 부정(not) 값 계산, -arr와 동일

 

※ 서로 다른 배열간에 사용하는 함수

함수이름 설명
add 두 배열에서 같은 위치의 원소끼리 덧셈
subtract 첫번째 배열 원소 - 두번째 배열 원소
multiply 배열의 원소끼리 곱셈
divide 첫번째 배열의 원소에서 두번째 배열의 원소를 나눗셈
power 첫번째 배열의 원소에 두번째 배열의 원소만큼 제곱
maximum, fmax 두 원소 중 큰 값을 반환. fmax는 NaN 무시
minimum, fmin 두 원소 중 작은 값을 반환. fmin는 NaN 무시
mod 첫번째 배열의 원소에 두번째 배열의 원소를 나눈 나머지
greater, greater_equal, less,
less_equal, equal, not_equal 
두 원소 간의 >,>=,<,<=,==,!= 비교연산 결과를 불리언 배열로 반환
logical_and, logical_or, logical_xor 각각 두 원소 간의 논리연산. &,|,^ 결과를 반환

 

728x90
반응형