NumPy 활용, AI에게 제대로 시키려면 개념부터 잡아야 하는 3가지 이유

F1 레이스에서 이런 상황을 상상해보자. 레이스 내내 수천 개의 센서가 타이어 온도, 연료 소모량, 공기역학 데이터를 초당 수백 번씩 쏟아낸다. 팀 엔지니어가 AI에게 “이 데이터에서 타이어 온도가 기준치를 넘는 구간만 뽑아줘”라고 요청한다고 하자. 질문 하나로 코드가 나온다. 그런데 결과를 받고 나서 이게 맞는지 틀린지를 판단하려면, 데이터가 어떤 구조로 되어 있는지를 본인이 알고 있어야 한다.

NumPy 활용을 AI에게 맡기는 시대라도, 개념을 모르면 결과를 검증할 수 없다. 이 글에서 다루는 것은 코드 문법이 아니다. NumPy가 데이터를 어떤 방식으로 다루는지, 각 처리 단계에서 무엇을 결정해야 하는지, 그리고 그 단계마다 AI에게 어떻게 요청하면 되는지다.

NumPy 활용의 출발점 — 데이터를 배열로 본다는 것의 의미

NumPy를 처음 접할 때 가장 많이 듣는 설명이 “빠른 계산 도구”다. 맞는 말이지만, 그것만으로는 왜 써야 하는지 실감이 잘 안 온다.

NumPy 활용의 본질은 속도보다 구조에 있다. 데이터를 배열(ndarray)이라는 단일 구조로 통일하고, 그 위에서 모든 연산을 처리한다는 것이다. 엑셀에서 A열 전체에 IF 조건을 거는 작업을 생각해보자. NumPy에서는 그 열 전체가 배열 하나이고, 조건 하나가 배열 전체에 동시에 적용된다. 반복문 없이. 이것을 벡터 연산이라고 부른다.

머신러닝에서 NumPy를 기반으로 쓰는 이유도 여기에 있다. 모델이 학습할 때 처리하는 데이터는 수만 개에서 수백만 개의 수치가 배열 형태로 들어온다. 이 규모에서 엑셀 함수나 Python 반복문은 속도 면에서 실용적이지 않다. NumPy는 배열 전체를 한 번에 처리하도록 설계되어 있고, Scikit-learn, TensorFlow, PyTorch 모두 이 구조를 전제로 동작한다.

AI에게 NumPy 활용을 요청할 때, “배열 전체에 조건이 동시에 적용된다”는 이 개념이 잡혀 있어야 요청을 정확하게 할 수 있다. 그렇지 않으면 반복문 기반 코드를 받아도 그게 비효율적이라는 것을 알아챌 수 없다.

데이터를 꺼내는 단계 — 인덱싱과 슬라이싱을 어떻게 요청할 것인가

NumPy 활용에서 가장 먼저 마주치는 작업은 데이터를 꺼내는 일이다. 전체 배열에서 특정 위치의 값을 가져오거나, 조건에 맞는 값만 골라내는 것이다.

개념만 보면 SQL이나 엑셀과 다르지 않다. SQL의 WHERE절이 조건에 맞는 행을 걸러내듯, NumPy는 조건을 배열에 걸어 해당 값만 돌려준다. 엑셀에서 셀 범위를 드래그해서 선택하는 것처럼, NumPy는 배열의 시작과 끝 위치를 지정해 잘라낸다.

이 단계에서 결정해야 할 것은 딱 하나다. 무엇을 기준으로 데이터를 꺼낼 것인가. 위치 기준인지, 조건 기준인지를 먼저 정해야 AI에게 명확하게 요청할 수 있다.

예를 들어, “측정값 배열에서 100 이상인 값만 뽑아줘”라고 요청하면 조건 기준이다. SQL로 치면 WHERE value >= 100이고, AI는 이 맥락을 함께 적어줄수록 정확한 코드를 돌려준다. “2차원 배열에서 3번째 열 전체를 가져와줘”라고 요청하면 위치 기준이다. 이때 배열이 몇 행 몇 열짜리인지를 함께 알려주면 AI가 헷갈릴 여지가 없다.

인덱싱과 슬라이싱은 NumPy 활용에서 가장 기초가 되는 단계이지만, 이 단계에서 데이터 구조를 명시하지 않으면 AI가 돌려주는 코드가 엉뚱한 축을 기준으로 동작하는 경우가 생긴다.

데이터를 요약하는 단계 — 집계 연산에서 무엇을 결정해야 하는가

데이터를 꺼냈다면 다음은 요약이다. 평균, 합계, 최댓값, 표준편차처럼 배열 전체 또는 일부를 하나의 수치로 압축하는 작업이다.

SQL의 SUM, AVG, MAX와 개념이 같다. 차이는 NumPy에서는 어떤 방향으로 집계할 것인지를 명시해야 한다는 점이다. 2차원 배열에서 행 방향으로 평균을 구할 것인지, 열 방향으로 구할 것인지가 결과를 완전히 바꾼다.

이것이 axis(축) 개념이다. 엑셀에서 비유하면, 각 행의 합계를 구할 것인지 각 열의 합계를 구할 것인지를 정하는 것과 같다. NumPy에서는 axis=0이 열 방향(위→아래), axis=1이 행 방향(왼쪽→오른쪽)이다.

AI에게 집계 연산을 요청할 때 이 부분을 빠뜨리면, AI가 기본값(전체 배열 집계)으로 처리하거나 방향을 잘못 잡는다. “3행 5열짜리 배열에서 각 열의 평균을 구해줘”처럼 방향을 명시하는 것이 핵심이다. 개념으로는 간단하지만, 이 한 줄이 결과를 가르는 경우가 많다.

NumPy 배열 처리 구조와 AI 활용 개념 인포그래픽

데이터를 만드는 단계 — 난수 생성에서 분포를 왜 신경 써야 하는가

NumPy 활용에서 난수 생성은 엑셀의 RAND()와 달리 분포를 선택하는 작업이다. 이 차이를 이해하면 AI에게 요청할 때 훨씬 구체적으로 쓸 수 있다.

엑셀 RAND()는 0과 1 사이의 값을 아무 형태 없이 뽑는다. NumPy의 난수 생성은 어떤 분포를 따르는 난수를 얼마나 뽑을지를 함께 정한다. 머신러닝에서 이 차이가 중요한 이유는, 모델 학습에 쓰이는 초기값이나 테스트 데이터를 만들 때 분포가 결과에 직접 영향을 주기 때문이다.

현실에서 많이 쓰는 경우는 두 가지다. 자연계에서 발생하는 대부분의 데이터를 시뮬레이션할 때는 정규분포 난수를 생성한다. 가중치 초기화나 드롭아웃 마스크처럼 0과 1 사이에서 균일하게 뽑아야 할 때는 균등분포를 쓴다.

AI에게 요청할 때 “난수 1만 개 만들어줘”보다 “평균 0, 표준편차 0.01의 정규분포를 따르는 난수 1만 개를 배열로 만들어줘”처럼 분포 조건을 명시하면, 목적에 맞는 코드가 나온다. 분포가 무엇인지 모르면 이 요청 자체를 만들 수 없다.

※ 이 시나리오는 개념 설명을 위한 가상의 상황입니다. 실제 F1 팀의 전략과 다를 수 있습니다.

AI에게 NumPy를 시키기 전에 스스로 결정해야 할 것

NumPy 활용을 AI에게 맡길 때 결과 품질을 결정하는 것은 프롬프트의 문장력이 아니다. 처리할 데이터의 구조를 얼마나 명확하게 알고 있느냐다.

AI는 배열의 구조를 모른다. 내가 다루는 데이터가 1차원인지 2차원인지, 몇 행 몇 열인지, 어떤 값이 들어 있는지를 내가 먼저 파악하고 있어야 한다. 이것을 shape이라고 부른다. shape을 모르고 요청하면, AI가 그럴듯하게 생긴 코드를 내놓아도 실행하면 오류가 난다. 가장 흔한 원인이 배열 차원 불일치다.

데이터 처리 작업을 AI에게 요청할 때 기본으로 포함해야 할 정보는 세 가지다. 배열의 구조(몇 차원, 몇 행 몇 열), 원하는 처리 방향(행 기준인지 열 기준인지), 원하는 출력 형태(단일 값인지 배열인지). 이 세 가지를 갖추고 요청하면, AI가 shape 관련 오류 없이 정확한 코드를 돌려준다.

복잡한 작업은 단계를 나눠서 요청하는 것이 낫다. 배열 생성, 조건 필터, 집계 연산을 한 번에 묶어서 요청하면 중간 결과를 확인하기 어렵다. 바이브 코딩 MVP 개발에서 다룬 것처럼, 단계별로 쪼개고 각 단계의 출력을 확인하며 진행하는 방식이 NumPy 활용에서도 그대로 적용된다.

핵심 요약

NumPy 활용에서 AI를 잘 쓰는 방법은 결국 개념을 먼저 잡는 것이다. 배열이 어떤 구조인지, 데이터를 꺼내는 기준이 위치인지 조건인지, 집계할 때 어떤 방향인지, 난수를 뽑을 때 어떤 분포인지. 이 네 가지 판단을 스스로 내릴 수 있으면, AI가 만들어주는 코드가 맞는지 틀린지를 검증할 수 있다. 코드를 외우지 않아도 된다. 개념이 잡히면 요청이 정확해지고, 요청이 정확하면 결과가 바로 쓸 수 있는 코드로 돌아온다.

[링크 제안]

NumPy로 정리한 데이터를 분석에 연결하는 첫 번째 방법이 궁금하다면 이 글로 이어가자.

데이터를 다루기 전에 구조 자체를 어떻게 설계해야 하는지를 먼저 잡고 싶다면 이 글이 도움이 된다.

NumPy 공식 문서는 NumPy 공식 사이트에서 확인할 수 있다.

NumPy 활용 자주 묻는 질문

NumPy는 배열 구조 위에서 수치 연산에 특화되어 있다. Pandas는 NumPy 위에 행·열 레이블이 붙은 DataFrame 구조를 얹은 것으로, 데이터를 표 형태로 다루는 데 적합하다. 실무에서는 NumPy로 연산하고 Pandas로 구조화하는 방식으로 함께 쓰인다.

기본적으로 그렇다. 배열 구조와 처리 방향, 원하는 출력 형태를 명확히 기술할 수 있다면, 코드 문법을 몰라도 AI가 실행 가능한 코드를 만들어준다. 중요한 것은 결과를 받고 나서 그것이 의도한 대로 동작하는지를 판단할 수 있는 개념이다.

대부분 배열의 구조(shape)를 요청 시 명시하지 않아서 생긴다. 2차원 배열인지 1차원인지, 집계 방향이 행인지 열인지를 요청에 포함하지 않으면 AI가 기본값으로 처리하면서 실제 데이터와 맞지 않는 코드가 나온다.

관련 글 보기