기계는 거짓말하지 않는다

Python NumPy(Numerical Python) 본문

Python

Python NumPy(Numerical Python)

KillinTime 2021. 6. 27. 19:00

NumPy

행렬이나 대규모 다차원 배열을 쉽게 처리할 수 있는 자료구조 기능 지원,

다양한 수치해석, 통계분석 기능을 제공하는 파이썬 라이브러리.

NumPy 패키지의 대부분 함수는 C나 Fortran으로 구현되어 우수한 성능 제공

Pandas, Matplotlib 등과 함께 사용 되는것이 일반적임

Install

command 창에서 pip install numpy 입력 (pip 패키지 관리자가 있어야 함)

python 버전 확인은 커맨드 창에 python --version 또는 py --version 입력.

 

NumPy를 사용하기 위해 import numpy를 사용

관행적으로 np 라는 별칭을 사용하여 import numpy as np로 사용한다.

NumPy 배열 클래스 ndarray

ndarray 생성

메서드 설명
np.array([]) 리스트를 이용한 ndarray 생성
np.arange(N)
np.arange(start, stop, step)
range() 함수와 유사
0..N-1의 1차원 배열 생성
start~stop-1 까지 step 간격으로 생성
np.zeros(shape, dtype=float, order=’C’) shape은 (N, M) 튜플 형식. N x M 배열의 크기를 지정
배열의 원소가 모두 0.0인 배열을 생성

dtype은 배열원소의 자료형 지정

order=’C’이면 C-program style로
행(row) 우선순서로 원소 생성

order=’F’ 이면 Fortran-program style로
열(column) 우선순서로 원소 생성
np.ones(shape, dtype=float, order=’C’) 배열의 원소가 모두 1.0인 배열을 생성
나머지 위와 동일
np.empty(shape, dtype=float, order=’C’) 초기화 되지 않은 ndarray 배열 객체를 생성
np.full(shape, fill_value, dtype=None, order=’C’) fill_value로 초기화된 ndarray 배열 객체를 생성
np.identity(N, dtype='')
(dtype='int64', 'float32' 등)
N x N 크기의 dtype 자료형 원소로 구성된 행렬에서 대각선 원소만 1.0이며, 나머지 원소들은 모두 0.0인 단위 행렬
(identity matrix) 생성
np.linspace(start, stop, num, endpoint, retstep, dtype) 배열의 원소 개수(num)만큼 start~stop 까지의
각 값의 편차로 배열 생성. 기본 num은 50
endpoint은 stop 값 포함 여부
dtype은 자료형
np.logspace(start, stop, num, endpoint, base, dtype) 위와 같으나 log 값으로 배열을 만듦
기본 num은 50, base는 10

 

import numpy as np

# ndarray 생성
arr = np.array([1, 2, 3, 4])
print(arr, '\n')

# 0으로 초기화
arr = np.zeros((3, 3))
print(arr, '\n')

# 1로 초기화
arr = np.ones((2, 2))
print(arr, '\n')

# 빈 값으로 초기화. 쓰레기 값
arr = np.empty((4, 4))
print(arr, '\n')

# 0 ~ 9까지 배열 생성
arr = np.arange(10)
print(arr, '\n')

# -5 ~ 4 까지 1씩 증가하면서 생성
arr = np.arange(-5, 5, 1)
print(arr, '\n')

arr = np.linspace(0, 10, 5)
print(arr, '\n')

# log base의 x는 1 ~ 5
arr = np.logspace(1, 5, num=5, base=2)
print(arr, '\n')

실행 결과

ndarray 클래스 메서드

메서드 설명
arr.ndim 배열의 dimension 확인
배열의 차원은 axes 또는 rank라고도 함

arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.ndim # 2
arr.shape 배열의 각 차원의 크기를 튜플로 반환

arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.shape # (2, 3)
arr.reshape 배열의 차원 변경
하나를 -1로 두면 자동 계산하여 변경

# 2행 5열로 변경
arr = np.arange(10).reshape(2, 5)

# 행 자동 계산
arr = np.arange(10).reshape(-1, 5)
arr.size 배열의 전체 원소 개수

arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.size # 6
arr.dtype 배열 원소의 자료형
(ex: numpy.int32, numpy.int16, numpy.float64)

arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.dtype # dtype('int64')
arr.itemsize 배열 원소 자료형의 크기(바이트 수)
arr.data 배열의 버퍼

arr.data # <memory at 0x00~~>
arr.astype(np.데이터타입) 배열의 타입 변환

# 64비트 실수로 변환
arr_float = arr_int.astype(np.float64)
# 문자형 데이터 배열을 정수형 데이터 배열로 변환
arr_str = np.array(['1', '2', '3'])
arr_int = arr_str.astype(np.int64)
print(arr_int.dtype) # dtype('int64')

NumPy에서 사용 가능한 자료형

자료형 typestr 설명
int8 uint8 i1 u1 1바이트(8비트) 부호있는 정수
1바이트(8비트) 부호없는 정수
int16 uint16 i2 u2 2바이트(16비트) 부호있는 정수
2바이트(16비트) 부호없는 정수
int32 uint32 i4 u4 4바이트(32비트) 부호있는 정수
4바이트(32비트) 부호없는 정수
int64 uint64 i8 u8 8바이트 (64비트) 부호있는 정수
8바이트 (64비트) 부호없는 정수
float16 f2 2바이트(16비트) 실수(float)
float32 f4, f 4바이트(32비트) 실수(float)
float64 f8, d 8바이트(64비트) 실수(float)
float128 f16, g 16바이트(128비트) 실수(float)
complex64 c8 실수부와 허수부 각각
4bytes(32-bit)로 구성된 복소수
complex128 c16 실수부와 허수부 각각
8bytes(64-bit)로 구성된 복소수
complex256 c32 실수부와 허수부 각각
16bytes(128-bit)로 구성된 복소수
bool ? bool 데이터(True 또는 False)
object O 파이썬 객체(object)
string_
bytes_
S 문자열(string)
unicode_
str_
U 유니코드 문자열(unicode string)
void V 여러 데이터 타입을 포함하고 있는
raw data

ndarray 연산

연산 문법 설명
산술 arr + n 행렬 arr의 각 원소에 n을 더함
arr - n 행렬 arr의 각 원소에 n을 뺌
arr * n 행렬 arr의 각 원소에 n을 곱함
arr / n 행렬 arr의 각 원소에 n을 나눔
(실수 나눗셈)
arr // n 행렬 arr의 각 원소에 n을 나눔
(정수 나눗셈
arr % n 행렬 arr의 각 원소에 n으로 나머지 연산
arr ** n 행렬 arr의 각 원소에 n 제곱
abs(arr + n) 행렬 arr의 각 원소 연산 후 절대값 계산
관계 arr < n 행렬 arr의 각 원소가 n 보다 작은지
각 원소의 bool 리스트 반환
arr <= n 행렬 arr의 각 원소가 n 보다 작거나
같은지 각 원소의 bool 리스트 반환
arr > n 행렬 arr의 각 원소가 n 보다 큰지
각 원소의 bool 리스트 반환
arr >= n 행렬 arr의 모든 원소가 n 보다 크거나 같은지 각 원소의 bool 리스트 반환
논리 arr.any() 행렬 arr의 원소 중 하나라도 True 이면 결과는 True,
모든 원소가 False 이면 결과는 False
arr.all() 행렬 arr의 원소 중 모두 True 이면
결과는 True,
하나라도 False 이면 결과는 False

 

ndarray 배열 끼리의 연산도 가능

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

# 각 행렬 원소의 덧셈
print(arr1 + arr2)
print(np.add(arr1, arr2), '\n')

# 각 행렬 원소의 곱셈
print(arr1 * arr2)
print(np.multiply(arr1, arr2), '\n')

# 행렬의 곱은 dot으로 표현
print(arr1.dot(arr2)) # 행렬의 곱

실행 결과

 

Comments