Python/Numpy

[Numpy] 파이썬 리스트 vs 넘파이 어레이(배열) 차이

jimmy_AI 2022. 1. 9. 16:55
반응형

파이썬 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배 이상 빨랐습니다.