티스토리 뷰

반응형

 

파이썬 배열 벡터화 연산

: Numpy array 산술 연산 - 브로드캐스팅 아님 :

 

numpy array(배열)는 브로드캐스팅을 이용하여 크기가 다른 배열간의 연산도 가능하다. 이번 포스팅에서는 브로드캐스팅은 다루지 않는다. 항등 행렬이나 역행렬에 대한 것도 생략하고 우선 크기가 같은 배열간의 연산과 배열과 스칼라 간의 연산에 대해 정리한다. (쉬운 것부터)

 

- 순 서 -

1. 벡터화 연산

2. Numpy 배열간의 산술 연산

3. 배열과 스칼라의 연산

4. 정리

 


1. 벡터화 연산

1-1. 벡터

벡터의 개념을 찾아보면 여러 가지 의미가 나온다. 그중 파이썬에서 사용하는 벡터의 개념을 이해하기로는, 한 가지 타입의 여러 개의 원소를 변수에 저장한 배열을 의미하는 것으로 이해하고 있다.

 

1-2. 벡터화 연산

벡터화 연산은 벡터의 같은 인덱스에 위치한 원소들끼리 연산을 수행하는 기능이다. Numpy에서 지원하는 강력한 연산 기능으로 반복문을 사용하지 않고도 반복해서 연산이 가능한 것이 특징이다. Numpy의 벡터화연산 기능을 사용하지 않는다면 for문과 같은 반복문을 구성해서 연산을 해야 같은 인덱스의 원소들끼리 연산을 수행할 수 있다.

 

2. Numpy 배열간의 산술 연산

2-1. 1차원 array 간의 연산

>>> import numpy as np

>>> array1 = np.arange(5)
>>> array1
[0 1 2 3 4]

위와 같이 생성된 array1 변수를 한번 더 더하게 되는 경우 각 인덱스의 요소들끼리 더한 값이 반환된다.

>>> array1 + array1
[0 2 4 6 8]

위 코드에서 계산된 과정을 나타내면 아래와 같다.

이러한 식으로 반복문을 사용하지 않더라도 벡터화 연산 기능으로 같은 인덱스에 위치한 요소들끼리 반복적으로 연산을 수행한다. 이런 벡터화 연산은 반복문을 사용한 연산보다 속도도 빠르다.

 

2-2. 2차원 ndarray 간 연산

>>> array2 = np.arange(6).reshape(2, 3)
>>> array2
[[0 1 2]
 [3 4 5]]

위와 같이 생성된 2차원 ndarray를 더하는 경우 1차원 array 간 덧셈과 마찬가지로 동일한 인덱스에 위치한 원소들끼리 더한 값이 반환된다.

>>> array2 + array2
[[ 0  2  4]
 [ 6  8 10]]

위 코드에서 연산된 과정을 보면 아래와 같다.

같은 방법으로 -, * / 연산이 가능하다. 연산을 할 때는 모두 같은 인덱스에 위치한 원소끼리 연산한 값을 반환하게 된다. 코드로 예를 들어 본다.

 

2-3. 2차원 ndarray 배열간 사칙연산

위에서 생성한 array2 변수를 이용해서 연산을 해본다. 

 

뺄셈 연산 코드

>>> array2 - array2
[[0 0 0]
 [0 0 0]]

곱셈 연산 코드

>>> array2 * array2
[[ 0  1  4]
 [ 9 16 25]]

나눗셈 연산 코드

>>> array2 / array2
[[nan  1.  1.]
 [ 1.  1.  1.]]

파이썬에서 어떤 수를 0으로 나누면 ZeroDivisionError: division by zero 에러가 발생한다. 만일 반복문을 이용해서 두 배열의 나눗셈 연산을 수행했다면 에러가 발생된 이후에는 연산을 할 수 없었을 것이다.

그런데 numpy 벡터화 연산은 반복문을 사용하지 않고서 반복된 연산이 가능한 강력한 기능을 갖고 있기 때문에 맨 처음 0으로 나눈 값에 대해서는 nan 값이 반환되고 나머지는 모두 나눗셈 연산을 정상 수행한 것을 알 수 있다.

 

 

3. 배열과 스칼라의 연산

배열간의 벡터화 연산이 이해가 되면 배열과 스칼라의 연산은 더 쉬울 수 있다. 스칼라를 배열의 모든 원소에 대입해서 연산을 하기 때문이다. 아래에서 1차원, 2차원 배열 연산의 예를 들어본다.

 

3-1. 1차원 배열과 스칼라의 연산

>>> import numpy as np

>>> array1 = np.arange(5)
>>> array1
[0 1 2 3 4]

위와 같이 생성된 1차원 array에 2를 곱하는 연산을 해보면 아래와 같다.

>>> array1 * 2
[0 2 4 6 8]

배열의 각각의 원소에 2를 곱한 값이 반환되는 것을 볼 수 있다. 덧셈, 뺄셈, 나눗셈 연산도 마찬가지이다.

 

덧셈 연산 코드

>>> array1 + 0.5
[0.5 1.5 2.5 3.5 4.5]

뺄셈 연산 코드

>>> array1 - 1
[-1  0  1  2  3]

나눗셈 연산 코드

>>> array1 / 2
[0.  0.5 1.  1.5 2. ]

덧셈, 뺄셈, 나눗셈에 대해서도 배열 각각의 원소에 스칼라 값을 연산하여 반환되었다.

 

3-2. 2차원 배열과 스칼라의 연산

>>> array2 = np.arange(6).reshape(2, 3)
>>> array2
[[0 1 2]
 [3 4 5]]

위와 같이 생성된 2차원 ndarray에 2를 곱하는 연산을 하면 아래와 같이 반환된다.

>>> array * 2
[[ 0  2  4]
 [ 6  8 10]]

array2라는 2차원 배열의 각각의 원소에 2를 곱한 값이 반환되었다. 덧셈, 뺄셈, 나눗셈도 마찬가지로 배열의 모든 원소에 스칼라 값이 연산되어 반환된다.

 

덧셈 연산 코드

>>> array2 + 0.5
[[0.5 1.5 2.5]
 [3.5 4.5 5.5]]

뺄셈 연산 코드

>>> array2 - 1
[[-1  0  1]
 [ 2  3  4]]

나눗셈 연산 코드

>>> array2 / 2
[[0.  0.5 1. ]
 [1.5 2.  2.5]]

 

 

4. 정리

Numpy는 벡터화 연산이라는 강력한 기능을 지원한다. 벡터화 연산을 이용하면 배열간 같은 인덱스에 위치한 원소끼리 연산을 수행할 수 있다. 

 

반복문을 이용하지 않고도 계산식 한 번으로 모든 원소에 반복적인 연산이 가능해지고 실제 반복문을 사용해서 연산을 하는 것보다 속도도 빠르다. 

 

원소끼리 연산을 하는 과정에서 오류가 발생되는 연산과정이 존재하더라도 나머지 오류가 발생하는 원소를 제외한 나머지 원소에 대해서는 정상적인 연산이 수행된다.

 

배열과 배열간의 연산뿐만 아니라 배열과 스칼라 간의 연산이 가능하고 이러한 배열과 스칼라의 연산은 다른 크기의 배열끼리의 연산인 브로드캐스팅의 방법과 동일한 방식으로 연산이 된다. 브로드캐스팅은 다음번 포스팅에 다루도록 한다.

 

파이썬 리스트와 Numpy 1차원 array(배열)의 연산을 비교한 포스팅 링크를 걸어둔다. 반복문을 사용해야 하는 리스트 연산과 numpy array의 연산의 비교를 설명하고 있다.

 

파이썬 리스트, 배열 연산 비교 : list, Numpy array

파이썬 리스트, 배열 연산 비교 : list와 Numpy array 이번 포스팅에서는 파이썬의 리스트(list)와 Numpy 1차원 배열 (array)의 연산에 대해 비교해본다. Numpy의 연산 기능을 이용하면 for문을 사용하지 않을

ooyoung.tistory.com

 

반응형
댓글
반응형