오늘의 물낌표
1) Python list와 Numpy array의 차이 세 가지
2) Numpy array는 언제 쓰는가?
첫 번째 Python list와 Numpy array 선언 차이
1) 각 자료형이 다를 때
Python list는 숫자형이나 문자형 여러 가지 자료형을 한 번에 다룰 수 있다.
Numpy array는 한 가지 동일한 자료형이어야 한다. (숫자형 + 문자형 = 모두 문자형으로 전환)
주의! Numpy array를 사용하기 전에 import numpy as np 선언해주기
# Python list
p_list = [1, 2, 3, 4, '물음표']
# 출력: [1, 2, 3, 4, '물음표']
# numpy array
np.array([1, 2, 3, 4, '물음표'])
# 출력값: array(['1', '2', '3', '4', '물음표']) (문자열로 변형되어 출력된다)
2) 2차원 이상 배열 구조일 때
Python list는 배열의 원소 구조가 달라도 괜찮다.
Numpy array는 배열의 원소 구조가 모두 동일해야 한다.
# Python list
p_list2 = [[1], [2, 3], [4, 5, 6]]
# 출력: [[1], [2, 3], [4, 5, 6]]
# Numpy array
# 배열 원소의 개수가 다를 때 잘못된 값이 출력
np.array([[1], [2, 3], [4, 5, 6]])
# 출력: array([list([1]), list([2, 3]), list([4, 5, 6])], dtype=object)
# 배열 원소의 개수를 동일하게 했을 때 정상적인 값이 출력
np.array([[1, 2], [3, 4], [5, 6]])
# 출력:
# array([[1, 2],
# [3, 4],
# [5, 6]])
두 번째 Python list와 Numpy array 연산 차이
Python list 연산은 덧셈일 경우 두 리스트 값이 꼬리를 물어 연결된다.
곱셈일 경우는 두 리스트 사이에는 적용을 못하지만 하나의 리스트에 숫자를 곱해주면 원소가 정수 값으로 복사가 된다.
주의! 리스트에서는 덧셈 , 곱셈를 제외한 다른 연산은 적용되지 않는다.
Numpy array은 모든 연산자를 사용할 수 있고, 두 값에서 동일한 위치에 있는 원소별로 연산이 된다.
array에 어떤 숫자를 연산해주면, 전체 값에 적용된다. (예제 확인)
주의! 두 값을 연산할 때는 array의 원소의 개수가 동일해야 한다.
# Python list 덧셈
p_list = [1, 2, 3, 4]
p_list2 = [5, 6, 7, 8]
p_list + p_list2
# 출력: [1, 2, 3, 4, 5, 6, 7, 8]
# Python list 곱셈
p_list * p_list2
# 출력: 에러발생
P_list * 2
# 출력: [1, 2, 3, 4, 1, 2, 3, 4]
# Numpy array
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr1 + arr2
# 출력: array([5, 7, 9])
arr1 * 2
# 출력: array([2, 4, 6])
세 번째 Python list와 Numpy array 메서드 차이
list 와 array 각각에 활용되는 메서드가 다르기 때문에
list 메서드를 array에 적용해서도 안 되고, array 메서드를 list에 적용해서도 안 된다!
중요한 것
Python list는 list.append(), list.pop()를 통해서 자유롭게 원소 변경 및 크기 변경이 가능하다.
반면, numpy array는 만들어지고 나면 메서드를 통해 원소의 update는 가능하지만, array의 크기를 변경할 수는 없다.
* array의 크기란 array.shape 했을 때 확인 할 수 있는 값인데,
예를 들어 array.shape 값이 (3, 4)라면 3행에 4열의 크기를 가지고 있는 array라는 것이다.
Numpy array는 언제 쓰는가?
Numpy array를 언제 쓰는지를 알기에 앞서 왜 쓰는지를 먼저 알아야 한다.
자유롭게 원소 변경 및 크기 변경이 가능한 list가 동적이기 때문에 정적인 numpy array에 비해 활용도가 높지 않을까라는 생각을 했다.
하지만, Numpy array는 list에 비해서 비교적 빠른 연산을 지원하고 메모리를 효율적으로 사용할 수 있는 큰 장점을 지니고 있다.
비교적 빠른 연산이 가능한 이유는 원소의 type checking을 할 필요가 없기 때문인데 이는 위에서 알아봤던 데이터 타입이 통일되기 때문이다.
메모리를 효율적으로 사용할 수 있는 이유는 universal function를 제공하기 때문에 같은 연산 반복에 대해 훨씬 빠르다.
이는 데이터의 크기가 클수록 차이가 커진다.
Numpy array의 장점을 통해서 언제 쓰는지를 알 수 있다. 다양한 활용 이유가 있겠지만,
빅데이터 분석 공부를 하고 있는 나에게는 '빅데이터'를 다룰 때 Numpy array의 장점이 크게 발휘한다.