본문 바로가기
두두 IT/파이썬

[PYTHON] NumPy 데이터 다루기

by DoDo's 2026. 5. 8.
반응형

🚀 [파이썬 데이터 분석] NumPy(넘파이) 완벽 정복 2편: 자유자재로 데이터 다루기 & 마법의 연산!

넘파이 1편에서 배열(Array)을 뚝딱 만들어내는 방법을 배우셨나요? 그렇다면 이제는 그 데이터를 내 입맛대로 요리할 차례입니다. 수만 개의 데이터 속에서 내가 원하는 값만 핀셋처럼 쏙쏙 뽑아내고(조회), 데이터의 뼈대를 바꾸고(형태 변경), for문 없이 1초 만에 계산을 끝내버리는(연산) 넘파이의 진짜 마법을 만나보시죠!


🔍 1. 원하는 데이터만 쏙쏙 뽑아내기 (Indexing & Slicing)

다차원 배열에서 데이터를 꺼낼 때는 축(axis)마다 콤마(,)로 구분하는 것이 핵심입니다.

① 기본 인덱싱 & 슬라이싱

  • 단일 조회: arr[행, 열]
    • arr[1, 2]: 1번 행, 2번 열의 데이터 딱 하나! (파이썬은 0부터 숫자를 셉니다)
  • 범위 조회 (슬라이싱): arr[시작:끝:간격, 시작:끝:간격]
    • arr[0:2, 1:4]: 0~1번 행을 가져오고, 열은 1~3번을 가져와!
    • arr[:, 2]: 행은 전부 다(:), 열은 2번 열만 가져와! (특정 컬럼만 뽑을 때 자주 씁니다)

🌟 ② 실무 활용도 1위! 불리언 인덱싱 (Boolean Indexing)

데이터 분석에서 가장 많이 쓰는 기능입니다. '조건'을 걸어서 True인 데이터만 필터링합니다.

Python
 
# 10보다 큰 숫자만 뽑아내기
arr[arr > 10]

# 조건이 2개일 땐? (반드시 괄호로 묶고 &, | 기호 사용)
# 10보다 크고 20보다 작거나 같은 짝수만 뽑기
arr[(arr > 10) & (arr <= 20) & (arr % 2 == 0)]

③ 팬시 인덱싱 (Fancy Indexing)

규칙 없이 내가 원하는 인덱스 번호만 콕콕 집어서 가져오고 싶을 때, 번호들을 리스트 [] 로 묶어서 던져줍니다.

  • arr[[0, 2, 4]]: 0번, 2번, 4번 행만 쏙 빼옵니다.

🧱 2. 데이터 뼈대 맘대로 주무르기 (Shape Manipulation)

데이터의 개수(알맹이)는 그대로 두면서, 행과 열의 모양(껍데기)만 자유자재로 바꾸는 방법입니다.

① 모양 바꾸기: reshape()

1차원 배열을 2차원 표로 만들거나, 그 반대로 할 때 사용합니다.

  • 💡 마법의 치트키 -1:
    • arr.reshape(5, -1): "행은 무조건 5줄로 만들 테니까, 열은 전체 데이터 개수에 맞춰서 파이썬 네가 알아서 계산해!"라는 뜻입니다. 아주 편리하죠!

② 차원 늘리기 & 줄이기

  • 차원 추가: np.expand_dims(arr, axis=0) 또는 arr[np.newaxis, :]
    • 1차원 [1,2,3]을 2차원 [[1,2,3]]으로 강제로 차원을 한 겹 씌웁니다. (딥러닝 모델에 데이터 넣을 때 필수!)
  • 차원 축소: arr.squeeze()
    • [[[1, 2, 3]]] 처럼 쓸데없이 껍데기만 많은 배열의 불필요한 차원을 벗겨냅니다.

③ 쫙 펴기: flatten() vs ravel() (⚠️ 면접 단골 질문!)

2차원 이상의 배열을 1차원 한 줄 기차로 쫙 폅니다. 결과는 똑같지만 내부 동작이 다릅니다.

  • flatten(): 원본과 완전 별개인 복사본(Copy)을 만듭니다. 안전하지만 메모리를 더 먹습니다.
  • ravel(): 원본을 그냥 1차원으로 보이게만 하는 창문(View)입니다. 값을 바꾸면 원본도 바뀝니다! 메모리를 아낄 수 있습니다.

④ 뒤집기: 전치 행렬 (.T)

  • arr.T: 엑셀의 '행/열 바꿈' 기능과 똑같습니다. 가로세로를 90도 뒤집습니다.

➕ 3. 수학이 제일 쉬웠어요! (넘파이 연산과 통계)

파이썬 리스트 대신 넘파이를 쓰는 진짜 이유입니다. 복잡한 for문 없이 배열 전체를 한 방에 계산해 줍니다!

① 벡터화 연산 (Element-wise)

  • arr * 10: 배열 안의 모든 숫자에 10을 각각 곱해줍니다.
  • arr1 + arr2: 두 배열의 같은 위치(인덱스)에 있는 숫자끼리 더해줍니다.

② 모양이 달라도 괜찮아! 브로드캐스팅 (Broadcasting)

모양이 다른 배열끼리 연산할 때, 넘파이가 작은 배열의 크기를 가상으로 쭈~욱 늘려서 큰 배열의 크기에 맞춰주는 엄청난 마법입니다.

  • (3, 3) 행렬에 (1, 3) 배열을 더하면? ➡️ 넘파이가 (1, 3)을 3줄로 복사해서 크기를 맞춘 뒤 더해줍니다!

③ 행렬 곱 연산 (Dot Product)

  • np.dot(A, B) 또는 A @ B: 선형대수학의 행렬 곱셈을 수행합니다. (딥러닝의 핵심 연산입니다.)

📊 4. 통계 함수와 조건문 (axis와 np.where)

① 통계와 axis (가장 헷갈리는 부분!)

sum(), mean(), max(), min() 등의 집계 함수를 쓸 때, 2차원 배열에서는 어느 방향으로 계산할지 axis를 지정해야 합니다.

  • arr.sum(axis=0): 행을 따라(↓) 수직으로 내려가며 더합니다. (즉, 각 '열'의 합계가 나옴)
  • arr.sum(axis=1): 열을 따라(→) 수평으로 이동하며 더합니다. (즉, 각 '행'의 합계가 나옴)
  • arr.argmax(): 가장 큰 값이 있는 인덱스 번호를 반환합니다.

🌟 ② 엑셀의 IF 함수와 똑같은 np.where

조건에 따라 값을 다르게 바꿀 때 사용하는 킹갓제너럴 함수입니다.

Python
 
# 구문: np.where(조건식, 참일_때_값, 거짓일_때_값)

# 배열에서 50보다 크면 '합격', 아니면 '불합격'으로 바꾸기
np.where(arr > 50, '합격', '불합격')

# 10보다 작으면 0으로 바꾸고, 아니면 원본 값(arr) 그대로 유지하기!
np.where(arr < 10, 0, arr)
반응형