파이썬 list와 numpy array 차이 비교
이번 시간에는 얼핏 비슷해 보이지만 완전히 기능이 다른
파이썬의 리스트와 넘파이 어레이의 차이를 간단히 비교해보도록 하겠습니다.
파이썬 리스트 vs 어레이 차이 1 : 선언 조건
리스트는 숫자형, 문자열 등 모든 자료를 타입을 보존하여 가질 수 있습니다.
(여러 가지 자료형 허용)
반면, 넘파이 어레이는 숫자형과 문자열이 섞이면 모두 문자열로 전환됩니다.
(한 가지 자료형만 허용)
import numpy as np
a = [1, 3, 5, 'a', 'b'] # 1, 3, 5는 숫자형, 'a', 'b'는 문자열
b = np.array([1, 3, 5, 'a', 'b']) # '1', '3', '5', 'a', 'b'의 문자열로 전환
2차원 이상의 배열 구조에서 리스트는 내부 배열에서 원소 개수가 달라도 됩니다.
그러나, 넘파이 어레이는 내부 배열 내 원소 개수가 모두 같아야 합니다.
a = [[1], [3, 5], [2, 4, 6]] # 문제 X
b = np.array([[1], [3, 5], [2, 4, 6]]) # 개수가 달라서 array 선언 불가능
# array([list([1]), list([3, 5]), list([2, 4, 6])], dtype=object)
파이썬 리스트 vs 어레이 차이 2 : 연산
python list는 덧셈 시 항목을 이어 붙이는 concatenate를 수행합니다.
또한, 리스트 간의 다른 연산은 허용하지 않습니다.
곱셈은 자연수 곱셈은 가능하며, 원소 복사를 의미합니다.
numpy array는 덧셈 시 항목 간 덧셈을 수행하며,
이는 다른 사칙연산도 마찬가지 입니다.
또한, 실수에 대한 사칙연산 과정도 원소 전체의 값에 대하여 수행이 가능합니다.
# 리스트 연산
a = [1, 3, 5]
b = [2, 4, 6]
a + b # [1, 3, 5, 2, 4, 6]
# 허용하지 않음 : a - b, a * b, a / b
a * 3 # [1, 3, 5, 1, 3, 5, 1, 3, 5]
# 넘파이 어레이 연산
a = np.array([1, 3, 5])
b = np.array([2, 4, 6])
a + b # array([ 3, 7, 11])
a * b # array([ 2, 12, 30])
a + 2 # array([3, 5, 7])
a * 3 # array([ 3, 9, 15])
파이썬 리스트 vs 어레이 차이 3 : 메소드
자료형 종류가 다르기때문에 자료형에서 지원하는 메소드의 종류도
당연히 다릅니다.
예를 들어, 리스트에서는 mean, argmax, round 등 어레이 메소드를 지원하지 않고,
어레이에서는 append, remove, extend 등 리스트 메소드를 지원하지 않습니다.
두 자료형의 자세한 메소드의 종류는 여기서 다루지는 않겠습니다.
a = [1, 3, 5]
b = np.array([1, 3, 5])
# 리스트 메소드(b.append(7) 등은 불가능)
a.append(7)
a.extend([9])
a.remove(9)
# 어레이 메소드(a.mean() 등은 불가능)
b.mean()
b.argmax()
b.round()
파이썬 리스트 vs 어레이 차이 4 : 연산 속도
같은 연산을 수행하는 경우, 일반적으로
numpy array가 연산 최적화가 더 잘 되어있습니다.
import time
# 리스트 연산 속도
a = list(range(10 ** 8))
start = time.time()
for i in range(10 ** 8):
a[i] *= 2
end = time.time()
print(end - start) # 약 17.35초
# 어레이 연산 속도
a = np.array(range(10 ** 8))
start = time.time()
a = a * 2
end = time.time()
print(end - start) # 약 1.35초
1억개의 원소에 값을 전부 2배로 곱하는 연산을 수행한 경우,
numpy array에서의 연산이 약 10배 이상 빨랐습니다.
'Python > Numpy' 카테고리의 다른 글
[Numpy] 파이썬 리스트를 어레이로, 어레이를 리스트로 변환(tolist 함수) (0) | 2022.01.09 |
---|---|
[Numpy] 파이썬 대각 행렬, 대각 성분 추출 함수 np.diag 사용법 (0) | 2022.01.06 |
[Numpy] np.ones, ones_like, zeros, zeros_like 정리 + full, empty (0) | 2022.01.05 |