파이썬 기본 내장 라이브러리 math 는 실수(real number)에 대해서만 연산을 지원
-> 컨테이너 자료형에 대해 연산이 불가하므로 반복문 등으로 배열 연산 수행
Numpy 배열은 범용 함수(universal functions)를 제공.
범용함수는 브로드캐스팅(broadcasting) 및 형식 캐스팅(type casting) 기능을 ndarray 클래스로 지원하며, 배열의 요소별 연산을 고속으로 수행하는 벡터화된 래퍼 함수(wrapper function) 임.
브로드캐스팅 : numpy 배열에서 차원의 크기가 서로 다른 배열에서도 산술 연산을 가능하게 하는 원리 -> 두 배열 간 차원의 크기가 (4, 2),(2, )일 때 산술 연산을 실행한다면 (2, )의 배열이 (4, 2) 행렬의 각 행에 대해 요소별 연산을 실행. 이처럼 두 배열 간의 차원의 크기가 달라도 차원의 크기가 더 큰 배열에 대해 작은 배열을 여러 번 반복하지 않아도 되는것을 의미.
형식 캐스팅 : 연산하려는 두 배열의 자료형(dtype)을 비교해 표현 범위가 더 넓은 자료형을 선택하는 원리 -> int 배열과 float 배열의 산술 연산을 수행할 때 암시적으로 float 형식으로 변환해 결과값을 얻음.
[브로드캐스팅 기능의 허용 규칙]
- 두 배열의 차원(ndim)이 같지 않다면 차원이 더 낮은 배열이 차원이 더 높은 배열과 같은 차원의 배열로 인식됨. -> (1, 2) 배열과 (1, 4, 2)의 배열을 연산한다면 (1, 2) 배열은 (1, 1, 2) 배열로 간주함.
- 반환된 배열은 연산을 수행한 배열 중 차원의 수(ndim)가 가장 큰 배열이 됨
- 연산에 사용된 배열과 반환된 배열의 차원의 크기(shape)가 같거나 1일 경우 브로드캐스팅 가능
- 브로드캐스팅이 적용된 배열의 차원 크기(shape)는 연산에 사용된 배열들의 차원의 크기에 대한 최소 공배수 값으로 사용. -> (6, 2, 1), (2, 3)의 배열을 브로드캐스팅 한다면 각 요소의 최소 공배수 값을 반환해서 (6, 2, 3)이 됨.(2, 3)은 가장 큰 차원 수(ndim)로 변환되어 (1,2,3)이 됨. 이 값에 각 요소의 최소 공배수 값을 구한다면 lcm(6,1)=6, lcm(2,2)=2, lcm(1,3)=3이 됨
범용함수는 전체 원소에 대해 고속 연산을 통해 배열 안의 원소별 연산을 간단하게 진행
import numpy as np
array1 = np.array([1,2,3,4]).reshape(2,2)
array2 = np.array([1.5,2.5])
add = array1 + array2
print(add)
<배열의 브로드캐스팅과 형식 캐스팅>
[[2.5 4.5]
[4.5 6.5]]
[배열의 범용 함수]
수학 함수 | 설명 |
np.add(array1, array2) | 요소의 덧셈 |
np.subtract(array1, array2) | 요소의 뺄셈 |
np.multiply(array1, array2) | 요소별 곱셈 |
np.divide(array1, array2) | 요소별 나눗셈 |
np.power(array1, array2) | 요소별 제곱 |
np.mod(array1, array2) | 요소별 나눗셈의 나머지 |
mp.floor_devide(array1, array2) | 요소별 나눗셈 내림 처리 |
np.logaddexp(array1, array2) | 요소별 지수의 합을 로그 처리 |
np.logaddexp2(array1, array2) | 요소별 2의 제곱의 합을 밑이 2인 로그 처리 |
np.positive(array) | 요소별 양수 곱 |
np.negative(array) | 요소별 음수 곱 |
np.abs(array) | 요소별 절댓값 |
np.round(array) | 요소별 반올림 |
np.ceil(array) | 요소별 올림 |
np.floor(array) | 요소별 내림 |
np.trunc(array) | 요소별 절사 |
np.maximum(array1, array2) | 요소별 최댓값 |
np.minimum(array1, array2) | 요소별 최솟값 |
np.sqrt(array) | 요소별 제곱근 |
np.exp(array) | 요소별 지수 |
np.log(array) | 요소별 밑이 e인 로그 |
np.log2(array) | 요소별 밑이 2인 로그 |
np.log10(array) | 요소별 밑이 10인 로그 |
삼각 함수 | 설명 |
np.sin(array) | 요소별 사인 |
np.cos(array) | 요소별 코사인 |
np.tan(array) | 요소별 탄젠트 |
np.arcsin(array) | 요소별 아크사인 |
np.arccos(array) | 요소별 아크 코사인 |
np.arctan(array) | 요소별 아크 탄젠트 |
np.arctan2(array1, array2) | 요소별 아크 탄젠트 (array1, array2) |
np.sinh(array) | 요소별 하이퍼볼릭 사인 |
np.cosh(array) | 요소별 하이퍼볼릭 코사인 |
np.tanh(array) | 요소별 하이퍼볼릭 탄젠트 |
np.arcsinh(array) | 요소별 하이퍼볼릭 아크 사인 |
np.arccosh(array) | 요소별 하이퍼볼릭 아크 코사인 |
np.arctanh(array) | 요소별 하이퍼볼릭 아크 탄젠트 |
np.deg2rad(array) | 요소별 각도에서 라디안 변환 |
np.rad2deg(array) | 요소별 라디안에서 각도 변환 |
np.hypot(array1, array2) | 요소별 빗변 계산 |
비트 연산 함수 | 설명 |
np.bitwise_and(array1, array2) | 요소별 AND 연산 |
np.bitwise_or(array1, array2) | 요소별 OR 연산 |
np.bitwise_xor(array1, array2) | 요소별 XOR 연산 |
np.bitwise_not(array) | 요소별 NOT 연산 |
np.left_shift(array1, array2) | 요소별 LEFT SHIFT 연산 |
np.right_shift(array1, array2) | 요소별 RIGHT SHIFT 연산 |
비교 함수 | 설명 |
np.greater(array1, array2) | 요소별 array1 > array2 연산 |
np.greater_equal(array1, array2) | 요소별 array1 >= array2 연산 |
np.less(array1, array2) | 요소별 array1 < array2 연산 |
np.less_equal(array1, array2) | 요소별 array1 <= array2 연산 |
np.equal(array1, array2) | 요소별 array1 == array2 연산 |
np.not_equal(array1, array2) | 요소별 array1 != array2 연산 |
논리 함수 | 설명 |
np.logical_and(array1, array2) | 요소별 Boolean 자료형 논리 AND 연산 |
np.logical_or(array1, array2) | 요소별 Boolean 자료형 논리 OR 연산 |
np.logical_xor(array1, array2) | 요소별 Boolean 자료형 논리 XOR 연산 |
np.logical_not(array1) | 요소별 Boolean 자료형 논리 NOT 연산 |
-> 브로드캐스팅에 의해 배열의 크기가 보존되는 연산함수임. 단일 배열/행렬에 대한 원소 간 연산을 수행한다면 ndarray 클래스가 아닌 int32 등의 자료형으로 반환되는 범용 함수도 있음.
[단일 배열 또는 행렬 범용 함수]
수학 함수 | 설명 |
np.dot(array1, array2) | 배열의 점곱 |
np.cross(array1, array2) | 배열의 벡터곱 |
np.inner(array1, array2) | 배열의 내적 |
np.outer(array1, array2) | 배열의 외적 |
np.tensordot(array1, array2) | 배열의 텐서곱 |
np.sum(array) | 배열 원소의 합 |
np.prod(array) | 배열 원소의 곱 |
np.cumsum(array) | 배열 원소의 누적 합 |
np.cumprod(array) | 배열 원소의 누적 곱 |
np.diff(array) | 배열 원소별 차분 |
np.gradient(array) | 배열 원소별 기울기 |
np.matmul(array1, array2) | 배열의 행렬 곱 |
'영상처리 > OpenCV' 카테고리의 다른 글
ndarray 클래스 - 관심영역 (0) | 2022.06.07 |
---|---|
matrix 클래스 (0) | 2022.06.07 |
배열 병합 및 분리 (0) | 2022.06.07 |
배열 차원 변형 (0) | 2022.06.07 |
배열의 블록 단위 요소에 접근 (0) | 2022.06.07 |