영상처리/OpenCV

배열 연산

성혜영 2022. 6. 7. 14:12

파이썬 기본 내장 라이브러리 math 는 실수(real number)에 대해서만 연산을 지원

-> 컨테이너 자료형에 대해 연산이 불가하므로 반복문 등으로 배열 연산 수행

 

Numpy 배열은 범용 함수(universal functions)를 제공.

범용함수는 브로드캐스팅(broadcasting) 및 형식 캐스팅(type casting) 기능을 ndarray 클래스로 지원하며, 배열의 요소별 연산을 고속으로 수행하는 벡터화된 래퍼 함수(wrapper function) 임.




브로드캐스팅 : numpy 배열에서 차원의 크기가 서로 다른 배열에서도 산술 연산을 가능하게 하는 원리 -> 두 배열 간 차원의 크기가 (4, 2),(2, )일 때 산술 연산을 실행한다면 (2, )의 배열이 (4, 2) 행렬의 각 행에 대해 요소별 연산을 실행. 이처럼 두 배열 간의 차원의 크기가 달라도 차원의 크기가 더 큰 배열에 대해 작은 배열을 여러 번 반복하지 않아도 되는것을 의미.

 

형식 캐스팅 : 연산하려는 두 배열의 자료형(dtype)을 비교해 표현 범위가 더 넓은 자료형을 선택하는 원리 -> int 배열과 float 배열의 산술 연산을 수행할 때 암시적으로 float 형식으로 변환해 결과값을 얻음.

 

 

[브로드캐스팅 기능의 허용 규칙]

  1. 두 배열의 차원(ndim)이 같지 않다면 차원이 더 낮은 배열이 차원이 더 높은 배열과 같은 차원의 배열로 인식됨. -> (1, 2) 배열과 (1, 4, 2)의 배열을 연산한다면 (1, 2) 배열은 (1, 1, 2) 배열로 간주함.
  2. 반환된 배열은 연산을 수행한 배열 중 차원의 수(ndim)가 가장 큰 배열이 됨
  3. 연산에 사용된 배열과 반환된 배열의 차원의 크기(shape)가 같거나 1일 경우 브로드캐스팅 가능
  4. 브로드캐스팅이 적용된 배열의 차원 크기(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