티스토리 뷰

반응형

 

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

 

이번 포스팅에서는 파이썬의 리스트(list)와 Numpy 1차원 배열 (array)의 연산에 대해 비교해본다. Numpy의 연산 기능을 이용하면 for문을 사용하지 않을 수 있기 때문에 이참에 정리하면서 복습을 해보려고 한다. 혹시나 Numpy 배열 연산중 broadcasting과 ndarray를 찾는 분이 있으실까 봐 관련 내용은 없음을 먼저 밝힌다.

 

- 순서 -

1. Numpy 

2. ragne와 np.arrange 함수를 이용하여 list, array 생성

3. 리스트(list)와 numpy 배열(array) 연산 비교

4. 정리

 


1. Numpy

Numpy는 Numerical Python의 줄임말로 파이썬의 산술 계산에 매우 유용한 라이브러리이다. Numpy array를 이용하면 반복문을 이용하지 않고도 배열의 연산이 가능해지고 braoadcasting 기능을 이용하면 다른 차원의 배열끼리의 연산을 수행할 수도 있다. Numpy는 대용량의 데이터에 대한 연산도 가능하고 pandas, matplotlib과 같은 데이터 분석을 하기 위해 꼭 알아두어야 할 라이브러리 중 하나이다. 

 

Numpy의 기능을 사용하기 위해선 우선 Numpy를 import 해야 하고 식별자는 아마 모든 파이썬 이용자가 np를 사용하고 있을 것이다. import 문장은 아래와 같다.

import numpy as np

 

이번 포스팅에서는 Numpy의 1차원 array를 이용하여 for문을 이용하지 않고도 연산을 하는 방법을 정리해본다.

 

2. 숫자로 이루어진 list, array 생성

array 연산 기능을 비교하기 위해서 먼저 0부터 10까지 숫자로 이루어진 list와 array를 생성해 본다. 이때  list는 range 함수로 array는 np.arange 함수를 사용한다. 두 함수는 동일하게 사용할 수 있다. 코드는 아래와 같다.

 

2-1. 괄호 안의 숫자가 하나인 경우

>>> l = list(range(11))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  # list

>>> a = np.arange(11)
>>> a
[ 0  1  2  3  4  5  6  7  8  9 10]  # array

 

위 코드에서 생성된 숫자 범위는 range(11), np.arange(11) 이라고 함수를 사용 했는데 0부터 10까지 숫자 범위가 생성되었다. 이렇듯 range 함수와 np.arange 함수는 괄호 안에 숫자를 하나만 쓰는 경우 괄호 안의 숫자는 stop 숫자가 되고 숫자 범위에 이 stop 숫자는 포함시키지 않는다. 시작 숫자는 0이다.

 

괄호 안에 쉼표로 구분하여 숫자를 두 개를 쓰거나 세개를 쓰는 경우 숫자의 범위가 달라진다. 먼저 숫자 두개를 쓴 코드는 아래와 같다.

 

2-2. 괄호 안의 숫자가 두 개인 경우

>>> l = list(range(1, 11))
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a = np.arange(1, 11)
>>> a
[ 1  2  3  4  5  6  7  8  9 10]

괄호 안에 숫자 두 개를 쓰는 경우 (start, stop) 숫자를 의미한다. 숫자를 한 개만 입력할 때와 마찬가지로 stop 숫자는 숫자 범위에 포함되지 않는다.

 

2-3. 괄호 안의 숫자가 세 개인 경우

>>> l = list(range(1, 11, 2))
>>> l
[1, 3, 5, 7, 9]

>>> a = np.arange(1, 11, 2)
>>> a
[1 3 5 7 9]

숫자 세 개의 경우 (start, stop, step) 숫자를 의미한다. 세 번째 숫자는 숫자끼리의 간격을 나타낸다. 아래에서 이러한 range, np.arange 함수를 이용하여 array의 for문을 이용하지 않는 계산식을 비교해본다.

 

 

3. list와 numpy array 연산 비교

3-1. list 끼리의 연산과 numpy array 끼리 연산의 사칙연산 비교

list와 list의 사칙연산은 + 연산만 가능하다. +연산을 하는 경우 수학과 같은 덧셈의 기능을 하는 것이 아닌 리스트와 리스트를 합해주는 기능을 한다. 반면 numpy array는 원소별 덧셈의 결과를 출력한다. 코드를 비교하면 아래와 같다. 

>>> l1 = list(range(1, 11, 2))
>>> l2 = list(range(2, 11, 2))
>>> l1 + l2
[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

>>> a1 = np.arange(1, 11, 2)
>>> a2 = np.arange(2, 11, 2)
>>> a1 + a2
[ 3  7 11 15 19]

list와 array의 + 연산 출력 값이 다른 것을 확인할 수 있다. 아래에서 array의 나머지 사칙연산 코드를 확인해본다. list와 list의 -, *, / 연산을 하는경우 TypeError가 발생한다.

>>> a1 = np.arange(1, 11, 2)  # [ 1 3 5 7 9 ]
>>> a2 = np.arange(2, 11, 2)  # [ 2 4 6 8 10 ]

>>> a1 - a2
[-1 -1 -1 -1 -1]

>>> a1 * a2
[ 2 12 30 56 90]

>>> a1 / a2
[0.5        0.75       0.83333333 0.875      0.9       ]

numpy array의 경우 array와 array의 -, *, / 연산도 원소별로 수행하는 것을 확인 할 수 있다.

 

3-2. list, array와 스칼라 연산의 비교

list와 array의 각 원소에 하나의 숫자를 곱하는 경우를 비교해본다. 이런 경우 array는 단순히 * 연산을 이용해서 각 원소의 곱을 구할 수 있지만 list는 * 연산을 사용하는 경우 list를 반복하는 기능을 하게 된다. 그래서 list의 경우에는 각각의 원소에 곱셈을 반복할 때는 for문을 이용해서 구해야 한다. 코드의 비교는 아래와 같다. 

>>> l1 = list(range(5))
>>> l1 * 2
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

>>> l2 = [i * 2 for i in range(5)]
>>> l2
[0, 2, 4, 6, 8]

>>> a =  np.arange(5)
>>> a * 2
[0 2 4 6 8]

코드는 위에서부터 list에 * 연산을 사용했을 때, 두 번째는 리스트의 각 원소에 2를 곱하는 식을 for문으로 작성했을 때, 세 번째는 array에 *연산을 사용했을 때이다.

 

이에서 본 예시는 원소의 개수가 적은 편에 속하지만 데이터 분석을 할 때에는 방대한 양의 데이터를 분석해야 하는 경우가 많이 있다. 이럴 때 전처리를 하거나 각 원소의 연산하는 등의 산술 연산이 필요한 경우에는 numpy의 array를 이용하면 보다 간편하게 데이터 처리를 할 수 있게 된다. 위에서 설명한 내용을 아래에서 다시 간략하게 요약해 본다.

 

4. 정리

1) Numpy는 파이썬의 산술 연산에 유용하게 사용된다. for문을 이용하지 않으면서 array연산이 가능하고 ndarray의 broadcasting 기능을 이용할 수도 있다.

2) 숫자로 이루어진 list와 array를 생성할 때는 각각 ragne 함수와 np.arange 함수를 이용한다. 숫자 개수에 따라 각 숫자는 (stop), (start, stop), (start, stop, step)를 의미한다.

3) array와 array의 사칙연산은 각각의 원소끼리의 사칙연산을 수행한다.

4) list와 list 사칙연산은 +연산만 가능하고 각 원소의 덧셈이 아닌 두 list를 합치는 기능을 하게 된다.

5) list, array의 각 원소에 연산을 할 때 array는 array에 연산자를 바로 대입하면 되지만 list는 for문을 이용해서 연산해야 한다.

 

반응형
댓글
반응형