F1 레이스에서 이런 상황을 상상해보자. 피트월 엔지니어가 레이스 내내 쏟아지는 수천 개의 센서 데이터를 손으로 하나씩 계산기에 입력하고 있다. 타이어 온도, 연료량, 랩타임, 서스펜션 압력 — 데이터는 1초마다 갱신된다. 계산이 끝나기 전에 레이스는 이미 끝나 있다.
numpy 배열은 이 상황을 바꾸는 도구다. 수백만 개의 숫자를 한 번에 처리하고, 파이썬 리스트보다 수십 배 빠르게 연산한다. 머신러닝 모델이 데이터를 받아들이는 유일한 형태가 바로 numpy 배열이기 때문에, 이 개념을 모르면 AI 입문의 첫 문이 열리지 않는다.
요즘은 Claude나 ChatGPT 같은 AI에게 “이 데이터 분석해줘”, “numpy로 배열 만들어줘”라고 요청하는 것 자체는 누구나 할 수 있다. 문제는 돌아온 코드가 맞는지 틀렸는지, 내 데이터 구조에 맞는지 아닌지를 판단하지 못한다는 것이다. 개념을 모르면 AI가 뭘 했는지 읽을 수 없고, 읽지 못하면 수정 요청도 못 한다. 이 글은 numpy 배열의 개념을 먼저 잡는 것을 목표로 한다.
numpy 배열이란 무엇인가 — 리스트와 무엇이 다른가
파이썬에는 기본적으로 리스트라는 데이터 구조가 있다. 숫자를 넣을 수 있고, 꺼낼 수 있다. 그런데 리스트는 데이터를 보관하는 구조다. numpy 배열은 데이터를 연산하기 위한 구조다.
차이는 연산 방식에서 바로 드러난다. 리스트에서 곱셈 연산은 리스트를 두 번 이어 붙이는 동작이다. numpy 배열에서 곱셈 연산은 모든 원소에 숫자를 곱하는 수치 연산이다. 머신러닝에서 필요한 건 후자다. 데이터 전체에 동시에 수학 연산을 적용하는 것 — 그게 numpy 배열이 존재하는 이유다.
| 구분 | 파이썬 리스트 | numpy 배열 |
|---|---|---|
| 덧셈 연산 | 리스트 이어붙이기 | 원소별 덧셈 |
| 곱셈 연산 | 리스트 복사 | 원소별 곱셈 |
| 타입 | 혼재 가능 | 동일 타입 강제 |
| 메모리 | 흩어져 저장 | 연속 저장 |
| 행렬 연산 | 직접 구현 필요 | 내장 지원 |
AI에게 numpy 작업을 요청할 때, 이 차이를 모르면 결과물을 검증할 수 없다. 배열에 2를 곱했을 때 원소가 두 배가 된 게 맞는 건지, 리스트가 두 번 복사된 게 잘못된 건지를 구분하지 못한다. 개념이 먼저여야 하는 이유가 여기 있다.
numpy 배열이 빠른 이유 — 메모리 구조와 C 코드
numpy 배열이 빠른 데는 두 가지 구조적 이유가 있다.
첫 번째는 메모리 구조다. 파이썬 리스트는 각 원소가 메모리 여기저기에 흩어져 있고, 주소를 따라 하나씩 찾아간다. numpy 배열은 모든 데이터가 연속된 메모리 블록에 붙어 있다. CPU는 연속된 메모리를 한 번에 읽어올 수 있다. 찾아다닐 필요가 없다.
두 번째는 C 코드 실행이다. 파이썬은 코드를 실행할 때 한 줄씩 그때그때 번역한다. C언어는 실행 전에 미리 전부 번역해서 파일로 저장한다. numpy 안에는 C언어로 미리 번역이 끝난 파일이 들어 있다. import numpy as np는 그 파일을 메모리에 올리는 동작이고, 이후 배열 연산은 파이썬을 거치지 않고 C 코드가 직접 실행된다.
공장 설비로 비유하면 이렇다. 파이썬 리스트 루프는 작업자가 매번 매뉴얼을 보면서 하나씩 손으로 처리하는 것이다. numpy 배열은 전용 자동화 설비가 이미 세팅되어 있고 버튼 하나로 100만 개를 한 번에 처리하는 것이다. import numpy as np는 그 자동화 설비의 전원을 켜는 동작이다.
결과는 수치로 나온다. 100만 개 데이터에 1.5를 곱하는 연산을 파이썬 리스트 루프로 처리하면 약 0.08초, numpy 배열로 처리하면 약 0.001초다. 약 80배 차이다. 데이터가 커질수록 격차는 더 벌어진다.
AI에게 대용량 데이터 전처리 코드를 요청했을 때 돌아온 코드가 리스트 루프 방식인지 numpy 배열 방식인지를 구분할 수 있어야 한다. 속도가 80배 차이 나는 두 방식이 겉으로는 비슷하게 보일 수 있다. 이 차이를 알아야 “numpy 배열 방식으로 다시 짜줘”라고 정확하게 요청할 수 있다.
차원이란 무엇인가 — 데이터를 특정하기 위한 질문의 수
numpy 배열을 다룰 때 반드시 나오는 개념이 차원이다. 차원은 데이터 하나를 특정하기 위해 필요한 질문의 수다. 질문이 하나 추가될 때마다 차원이 하나 늘어난다.
현장 장비 온도 데이터를 예시로 보면 이렇다.
펌프 1대의 24시간 온도를 기록했다면 “몇 시 데이터야?”라는 질문 하나로 특정된다. 이게 1차원이다. 펌프가 4대로 늘어나면 “몇 번 펌프야?” 질문이 하나 더 붙는다. 이게 2차원이다. 여기에 온도·진동·압력 3가지 측정 항목이 추가되면 “어떤 항목이야?” 질문이 하나 더 붙는다. 이게 3차원이다. 월별로 데이터를 쌓으면 “몇 월 데이터야?”까지 4개의 질문이 필요해진다. 이게 4차원이다.
| 차원 | 구성 | 필요한 질문 | 엑셀 표현 |
|---|---|---|---|
| 1차원 | 펌프 1대 × 24시간 | 몇 시? | ✅ 가능 |
| 2차원 | 펌프 4대 × 24시간 | 몇 번 펌프? + 몇 시? | ✅ 가능 |
| 3차원 | 펌프 4대 × 3항목 × 24시간 | 몇 번? + 어떤 항목? + 몇 시? | ❌ 불가 |
| 4차원 | 12개월 × 펌프 4대 × 3항목 × 24시간 | 몇 월? + 몇 번? + 어떤 항목? + 몇 시? | ❌ 불가 |
엑셀은 2차원, 즉 행과 열이 전부다. 3차원부터는 표 구조로 담을 방법이 없다. numpy 배열은 몇 차원이든 shape 하나로 구조를 표현하고 그 위에서 연산한다. 4차원 기준 12 × 4 × 3 × 24 = 3,456개 숫자가 하나의 배열 안에 들어간다.
이 개념을 알아야 AI에게 정확하게 요청할 수 있다. “3차원 배열로 만들어줘”와 “2차원으로 펼쳐줘”는 완전히 다른 작업이다. shape이 무엇인지 모르면 AI가 돌려준 배열이 내가 원하는 구조인지 판단조차 못 한다.
reshape은 이 차원을 바꾸는 작업이다. 데이터 수가 같다면 차원을 자유롭게 바꿀 수 있다. 32개짜리 1차원 배열은 4행 8열 2차원으로, 2행 16열로, 혹은 2 × 4 × 4 3차원으로도 바꿀 수 있다. AI에게 “이 배열 4행 8열로 reshape해줘”라고 요청하려면, reshape이 데이터를 바꾸는 게 아니라 구조를 바꾸는 작업이라는 걸 먼저 이해해야 한다. 그래야 결과물이 맞는지 틀렸는지 확인할 수 있다.
머신러닝에서 numpy 배열이 필수인 이유
머신러닝 모델이 하는 일을 단순화하면 이렇다. 입력 데이터를 받아서 행렬 연산을 반복하고, 결과값을 출력한다. 장비 이상 감지 모델이라면 온도·진동·압력 값을 받아서 가중치 행렬과 곱하고, 정상인지 이상인지를 판정한다. 이 가중치 행렬 곱하기가 학습 과정에서 수천에서 수만 번 반복된다.
행렬 연산이 불가능한 파이썬 리스트로는 시작조차 못 한다. numpy 배열 형태로 데이터가 준비되어야 행렬 연산이 가능하다. 데이터 양도 문제다. 일반 엑셀 작업은 수백에서 수천 행이지만, 머신러닝 학습 데이터는 수십만에서 수억 행이다. 학습을 한 번 돌리는 데 수천 번 반복 연산이 필요하고, 그 속도가 안 나오면 모델 학습 자체가 현실적으로 불가능하다.
표로 표현할 수 없는 데이터도 마찬가지다. 컬러 이미지 한 장은 가로 × 세로 × RGB 3채널짜리 3차원 배열이다. 음성 녹음 10초는 44만 개 숫자가 늘어선 1차원 배열이다. 동영상 1초는 30장의 이미지가 쌓인 4차원 배열이다. 어떤 데이터든 모델에 넣기 전에 반드시 numpy 배열 형태를 거친다. PyTorch, TensorFlow 같은 딥러닝 프레임워크의 Tensor도 numpy 배열 위에서 설계된 개념이다.
numpy를 모르는 상태에서 AI에게 데이터 전처리를 맡기면 어떻게 되는가. 코드는 나온다. 실행도 된다. 그런데 그 결과물이 모델 입력에 맞는 shape인지, dtype은 올바른지, 데이터 손실은 없는지를 확인할 수 없다. AI가 만든 코드의 오류를 잡아줄 수 있는 사람이 되려면, numpy 배열이 어떻게 생겼는지를 먼저 알아야 한다.
핵심 요약
numpy 배열을 써야 하는 이유는 하나로 귀결된다. 머신러닝은 대용량 데이터에 대한 반복적인 수치 연산이 전부이고, numpy 배열은 그 연산을 가장 빠르고 효율적으로 처리하는 구조다. 개념을 알아야 AI가 만든 코드를 검증할 수 있고, 검증할 수 있어야 제대로 된 수정 요청이 가능하다.
| 이유 | 핵심 |
|---|---|
| 행렬 연산 가능 | 리스트는 수치 연산 불가, 배열은 가능 |
| 압도적 속도 | 메모리 연속 구조 + C 코드 직접 실행, 약 80배 차이 |
| 고차원 지원 | 엑셀 2차원 한계, numpy는 N차원 가능 |
| 모든 데이터 처리 | 이미지·음성·센서까지 배열로 변환 가능 |
| AI 협업의 전제 | 개념을 알아야 AI 결과물을 검증하고 수정 요청할 수 있다 |
numpy 배열의 개념을 잡았다면 다음 질문은 자연스럽게 이어진다. 이 배열을 어떻게 설계해야 AI 분석에 바로 쓸 수 있는 구조가 되는가. 데이터 설계가 분석의 방향을 결정한다.
[링크 제안]
numpy 배열로 데이터를 다루기 시작했다면, 그 데이터가 어떤 구조로 설계되어야 AI 분석에 쓸 수 있는지 바로 이어서 확인해볼 만하다.
회귀분석이 numpy 배열로 구현되는 구조가 궁금하다면 이 글이 연결 고리가 된다.
numpy 공식 문서에서 배열 생성·연산·인덱싱 전체를 직접 확인할 수 있다: NumPy 공식 문서







