모든 것의 토대
NumPy (Numerical Python) 는 Python 수치 연산 거의 전부의 토대야. Pandas 가 이 위에 서 있고, PyTorch 와 TensorFlow 도 이 배열 언어를 공용어로 쓰고, scikit-learn 은 아예 요구해. PyArrow 도 대부분의 자리에서 호환되는 배열을 건네줘. ndarray 를 이해하면 modern Python data stack 의 엔진룸을 이해한 거야.
지금 stable 은 NumPy 2.5.1 (2026.7) 이야. NumPy 2.0 (2024.6) 이 legacy API 를 정리한 breaking-change 릴리스였고, 2.0 이후가 modern 세상이야.
왜 빨라?
Python 리스트는 포인터 벡터야. 요소 하나하나가 자기 type tag 와 reference count 와 allocation 을 가진 완전한 Python 객체고. 백만 요소 리스트를 순회하면 포인터 dereference 백만 번에 Python 메서드 dispatch 백만 번이 따라와.
NumPy ndarray 는 다르게 생겼어 — 같은 타입의 값들이 이어진 메모리 한 덩어리에 그대로 누워 있어. 요소별 포인터도, 요소별 type tag 도 없어. 순회는 Python overhead 없는 촘촘한 C loop 야. 리스트에선 몇 초 걸리던 연산이 배열에선 밀리초로 끝나.
그래서 손에 쥐는 게 뭐야?
- 빠른 n차원 배열 — 같은 타입, contiguous memory.
- Vectorized 연산 — 요소별 math 가 Python loop 없이 C 속도로.
- Broadcasting — 모양이 다른 배열들이 알아서 줄을 맞춰.
- Universal functions (ufuncs) —
np.sin,np.exp,np.maximum같은 것들, 전부 element-wise 에 병렬화 가능. - Linear algebra, FFT, random — 수치 연장통이 기본으로 들어 있어.
- Modern
GeneratorAPI —np.random.default_rng()가 legacy global state 를 대체.