컴퓨터 영상 처리/Numpy

2.Numpy 연산(Matrix Operations)

Zoo_10th 2024. 2. 28.

1. 행렬 연산 

1-1. 덧셈, 뺄셈

행렬의 덧셈과 뺄셈은 행과 열의 수가 같아야 된다. 즉, n x m 행렬의 덧셈과 뺄셈은 n x m 행렬끼리만 가능하다. 덧셈과 뺄셈은 같은 위치의 값을 더하거나 빼서 다시 n x m 행렬을 반환한다.

행렬 A + B = B + A 이고, 행렬 A - B = -(B - A) 이다. 즉, 행렬의 덧셈과 뺄셈은 교환법칙이 성립된다.

 

1-2. 곱셈

두 행렬의 곱셈은 앞의 행렬의 열과 뒤의 행렬의 행이 같아야 한다. 즉 n x m 행렬은 m x n 행렬끼리만 가능하다. (n은 서로 다를 수 있다.) 앞의 행렬 A와 뒤의 행렬 B의 곱은 A의 각 열과 B의 각 행에서 같은 위치의 요소끼리 곱한 뒤 모두 더해서 결과가 되는 행렬의 열(A)과 행(B)의 위치가 된다.

행렬의 곱셈은 AB≠BA이므로 교환법칙은 성립하지 않는다. 하지만 (AB)C = A(BC)인 결합법칙은 성립한다.

 

2. 브로드캐스팅(Broadcasting)

브로드캐스팅(Broadcasting)은 Numpy에서 제공하는 기능으로, 다른 모양(shape)을 가진 배열들 간에도 산술 연산을 수행할 수 있도록 해준다. 브로드캐스팅을 통해 작은 모양의 배열을 큰 모양의 배열에 맞춰 확장하고 연산을 수행할 수 있다.

 

2-1. 브로드캐스팅의 주요 특징

1) 차원(dimension)이 다른 배열 간에도 연산이 가능하다. 예를 들어 스칼라와 벡터, 벡터와 매트릭스의 연산이 가능하다.

2) 작은 모양의 배열을 큰 모양의 배열에 맞춰 확장하여 연산을 수행한다. 이를 통해 반복문 없이 배열 간의 연산을 효율적으로 수행할 수 있다.

3) 브로드캐스팅 규칙을 따라서 연산이 수행되며, 자동으로 배열의 모양을 맞춰준다. 연산이 수행되기 전에 모양을 일치시키는 작업이 자동으로 이루어진다.

4) 브로드캐스팅은 메모리를 절약하고 코드를 간결하게 작성할 수 있도록 도와준다.

브로드 캐스팅의 간단한 예로 스칼라의 모양을 요소별 곱셈이 가능하도록 b를 확장하여 연산한다.

 

2-2. 배열 하나의 차원이 1인 경우 브로드캐스팅이 가능하다.

브로드캐스팅은 배열의 차원이 1인 경우에도 적용될 수 있다. 특히 한 배열의 차원이 1이고 다른 배열의 해당 차원 크기와 일치하는 경우에 브로드캐스팅이 가능하다.

예를 들어, shape이 (n, m)인 배열과 shape이 (1, m)인 배열이 있다고 가정해보면, 이 경우, 열의 수 (m)는 동일하고 행의 수에서 차이가 있다. 이런 경우에는 브로드캐스팅을 통해 연산을 수행할 수 있다. 브로드캐스팅은 (1, m)인 배열을 (n, m)으로 확장하여 연산을 수행한다. 이를 통해 반복문 없이 각 요소별로 연산을 수행할 수 있다.

차원이 1인 경우의 브로드캐스팅       차원이 1이지만 열이 같지 않아 브로드캐스팅 불가

 

2-3. 벡터와 열이 1인 경우 브로드캐스팅이 가능하다.

하나의 배열이 벡터고 다른 배열의 해당차원 크기가 1인 경우에도 브로드캐스팅이 가능하다. 특히, n x 1 모양의 배열과 1 x m 모양의 배열은 브로드캐스팅을 통해 연산을 수행할 수 있다. 이 경우, 벡터의 차원이 1인 축을 확장하여(n, m) 모양의 결과 행렬을 생성한다.

예를 들어, shape이 (n, 1)인 배열과 shape이 (1, m)인 배열이 있다고 가정해보면, 이 경우, 하나의 배열은 열 벡터이고 다른 배열은 행 벡터다. 이런 경우에도 브로드캐스팅을 통해 연산을 수행할 수 있다. 열 벡터를 행 벡터로 확장하거나 행 벡터를 열 벡터로 확장하여 연산을 수행한다. 결과로 (n, m) 모양의 행렬이 생성된다.

 

3. 배열의 연산

3-1. 산술연산

- 사칙연산

Numpy의 배열에서 사용되는 산술 연산자(+, -, *, /, //, %, ** )는 요소별(element-wise) 연산을 수행합니다. 이는 두 배열의 동일한 위치의 요소끼리 연산을 하여 결과를 반환하는 것을 의미한다. 예를 들어, 두 개의 배열 A와 B가 있을 때, A + B는 A와 B의 각 요소를 더한 결과를 반환한다.

 

산술 연산자는 배열의 요소별로 적용되므로 배열의 크기가 일치해야 한다. 크기가 다른 배열끼리 연산을 수행할 경우 Numpy는 브로드 캐스팅 기능을 활용하여 크기를 자동으로 맞춰준다. 하지만 행렬 연산의 곱셈은 브로드캐스팅되지 않으며, 요소별 곱셈 (element-wise multiplication)이 아닌 행렬의 곱셈( matrix multiplication)을 수행해야 한다.

 

행렬의 곱셈을 수행하기 위해서는 @연산자나 dot() 함수를 사용해야 한다. 이를 통해 두 배열의 행렬 곱셈을 수행할 수 있다. 예를 들면, A@B는 배열 A와 B의 행렬 곱셈을 수행하여 결과를 반환한다. 마찬가지로, np.dot(A, B) 함수도 동일한 연산을 수행한다. Numpy의 산술 연산자는 요소별(element-wise) 연산에 사용되며, 행렬의 곱셈은 @연산자나, dot() 함수를 사용하여야 한다는 점을 주의해야 한다.

 

3-2. 단항 연산, 축연산

Numpy는 배열의 요소 간 단항 연산을 위한 다양한 함수를 제공한다. 이러한 함수는 배열 내부의 요소에 대한 연산을 수행하며, 각 요소별로 독립적으로 처리된다.

축연산은 배열의 특정 축에 해당하는 연산을 수행하는 것을 의미한다.

축연산은 배열의 특정 차원 또는 축을 따라 연산을 수행할 때 유용하다. 예를 들어, 2차원 배열의 경우, 행 또는 열을 따라 최댓값을 찾거나 평균을 계산하는 등의 작업을 수행할 수 있다. axis 매개변수를 사용하여 원하는 축을 지정하고 해당 축에 대한 연산을 수행할 수 있다.

따라서, Numpy의 단항 연산과 축연산은 배열 내부의 요소 간의 연산을 효율적으로 수행하고, 특정 축을 기준으로 연산을 진행할 수 있도록 도와준다.

 

1) sum/cumsum

np.sum() 함수와 np.cumsum() 함수는 배열의 요소들을 합산하는 연산을 수행하며, 누적합을 구할 때에는 np.cumsum() 함수를 사용한다. 이러한 함수들은 배열의 요소들을 효율적으로 다룰 수 있도록 도와준다.

np.sum() 함수는 배열 내의 요소들을 합산하여 결과를 반환한다. 이 함수는 axis 매개변수를 사용하여 원하는 축을 기준으로 합산 연산을 수행할 수 있다. 예를 들어, 2차원 배열의 경우 axis=0을 지정하면 각 열의 합을 계산하고, axis=1을 지정하면 각 행의 합을 계산한다.

np.cumsum() 함수는 배열 내의 요소들의 누적합을 순서대로 계산하여 결과를 반환 한다. 결과 배열의 크기는 원본 배열과 동일하며, 각 요소는 이전 요소들의 누적합을 나타낸다. 예를 들어 , 배열[1,2,3,4]에 대해 np.cumsum()을 적용하면 [1,3,6,10]의 결과가 반환된다.

 

2) min/max

np.min() 함수는 배열 내의 요소들 중에서 최소값을 반환하고, np.max() 함수는 배열 내의 요소들 중에서 최댓값을 반환한다. 두 함수는  axis 매개변수를 사용하여 원하는 축을 기준으로 최솟값과 최댓값을 계산할 수 있다.

예를 들어 2차원 배열의 경우 axis=0을 지정하면 각 열에서 최솟값과 최댓값을 계산하고 axis=1을 지정하면 각 행에서 최솟값과 최댓값을 계산한다. 기본적으로 axis 매개변수를 지정하지 않으면 전체 배열에 대해 최솟값과 최댓값을 계산한다.

 

3) sort

np.sort() 함수는 배열의 요소를 정렬하는 함수다. 기본적으로 오름차순으로 정렬된 새로운 배열을 반환합니다. 원본 배열은 변경되지 않는다.

예를 들어, [3, 1, 4, 2, 5]라는 배열이 있다면 np.sort() 함수를 사용하면 [1, 2, 3, 4, 5]와 같이 요소가 오름차순으로 정렬된 새로운 배열을 얻을 수 있다. 또한 np.sort() 함수는 axis 매개변수를 사용하여 다차원 배열에서 정렬할 축을 지정할 수도 있다. 이를 통해 행 또는 열을 기준으로 배열을 정렬할 수 있다. np.sort() 함수는 배열 내의 요소를 정렬해야 할 때 유용하게 사용된다.

 

 

728x90

'컴퓨터 영상 처리 > Numpy' 카테고리의 다른 글

1. Numpy 배열(Array)  (0) 2024.02.28

댓글