- Numerical Python의 약자로, 파이썬에서 과학 계산을 위한 대표적인 라이브러리이다.
- 주요 기능
- 배열 연산 (ndarry) : numpy의 핵심 데이터 구조는 다차원 배열인 ndarry이다.
이 배열은 일반적인 파이썬 리스트보다 빠르고, 효율적인 메모리 사용을 자랑하는 특징이 있으며 이를 통해 대규모 데이터의 수치 연산을 매우 빠르게 처리할 수 있다.- 벡터화된 연산 : Numpy는 배열 간의 연산을 벡터화된 방식으로 처리할 수 있어, 반복문을 사용하지 않고도 빠른 수치 연산을 수행할 수 있다.
- 다양한 수학 함수 제공 : Numpy는 선형대수, 푸레에 변환, 난수 생성 등 다양한 수학적 함수들을 제공하여 이를 통해 복잡한 수학적 계산을 간단하게 처리할 수 있다.
- 고성능 : Numpy는 내부적으로 c언어로 구현되어 있어, 파이썬의 기본 자료형보다 훨씬 빠른 성능을 제공한다.
numpy의 array와 list의 차이점numpy의 array와 Python의 기본 자료형인 list는 둘 다 데이터를 저장하고 처리하는 데 사용되지만, 몇 가지 중요한 차이점이 있다.
numpy의 array:numpy 배열은 동일한 데이터 타입을 가진 값만 저장할 수 있다. 즉, 모든 요소는 같은 자료형이어야 하며, 이는 배열의 메모리 관리와 연산 속도를 높이는데 도움이 됨.numpy 배열은 모두 정수형, 부동 소수점형, 혹은 문자열 등 특정 하나의 자료형으로 통일되어야 합니다.list:list는 다양한 데이터 타입을 혼합해서 저장이 가능하다. 즉, 정수, 문자열, 부동 소수점, 심지어 다른 리스트도 한 리스트 안에 포함될 수 있다.import numpy as np
np_arr = np.array([1, 2, 3, 4, 5]) # numpy안의 자료형은 통일 되어야 함
ls = [1, 2.5, "hello", [3, 4]] # list 자료형은 데이터 타입이 통일되지 않아도 됨
numpy의 array:
numpy 배열은 메모리를 연속적으로 사용하여 배열을 효율적으로 관리한다. 이는 메모리 상에서 데이터가 한 블록에 저장되기 때문에 CPU 캐시 효율이 높아지고, 특히 대용량 데이터 처리 시 성능이 매우 뛰어나다.numpy 배열에서 수행하면 내부적으로 C로 구현된 고속 연산을 사용하므로 성능이 list보다 훨씬 빠르다.Python의 list:
list는 비연속적인 메모리 구조를 가지며, 리스트 내 각 요소가 메모리 상에서 따로따로 저장될 수 있다. 그래서 대용량 데이터 처리 시 메모리 접근 시간이 길어질 수 있다.numpy 배열보다 떨어진다.numpy의 array:numpy 배열은 벡터화 연산을 지원한다. 즉, 배열 전체에 대해 한 번에 연산을 적용할 수 있다.list:list는 벡터화 연산을 지원하지 않으며, 각 요소에 대한 연산을 개별적으로 처리해야 한다.import numpy as np
a = np.array([1, 2, 3])
a_mul2 = a * 2 # [2 4 6]을 즉시 얻음
ls = [1, 2, 3]
ls_mul2 = [x * 2 for x in ls] # 리스트 컴프리헨션이나 반복문을 사용
# 속도차이가 얼마나 나는지 확인해보자
# 벡터화 연산과 for 루프의 비교
arr = np.random.random(1000000) # 100만개의 난수 생성
%timeit np.sum(arr)
# for 루프의 연산
def slow_sum(arr):
total = 0
for i in arr:
total += i
return total
%timeit slow_sum(arr)
결과
374 μs ± 28 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
88.9 ms ± 2.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
벡터화 연산의 평균 실행 시간은 374 마이크로초(μs)
for 루프 방식의 평균 실행 시간은 88.9 밀리초(ms)
for 루프 연산이 벡터화 연산에비해 약 238배 느림
numpy의 array:numpy는 배열을 처리하기 위한 다양한 내장 함수와 메서드를 제공한다.list:list는 배열에 비해 제공되는 함수가 제한적이다.numpy 같은 라이브러리를 사용해야 한다.numpy의 array:numpy 배열은 고정 크기이다.list:list는 가변 크기를 가지므로 자유롭게 요소를 추가하거나 삭제할 수 있다.numpy의 array:list:numpy 배열은 고성능 수치 연산에 최적화된 배열형 자료구조로, 메모리 효율성과 연산 속도가 매우 뛰어나다.