RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (117)
    • Study Note (80)
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (26)
      • Machine Learning (16)
      • Streamlit (9)
      • Django (1)
      • Deep Learning (12)
      • dbt (2)
      • SQL (3)
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/Deep Learning

딥러닝을 위한 필수 라이브러리, 의료 데이터로 정복하기

2026. 1. 2. 13:37

안녕하세요! 오늘은 딥러닝의 기본기 중의 기본기, NumPy(넘파이)를 정리해 보려고 합니다. PyTorch가 GPU 위에서 돌아가는 텐서라면, NumPy는 CPU 위에서 돌아가는 고성능 행렬 계산기입니다.

 

사실 PyTorch의 문법 대부분이 NumPy에서 왔기 때문에, NumPy를 잘 알면 PyTorch는 거의 공짜로 배우는 셈이죠. 의료 현장의 데이터를 예시로, 꼭 알아야 할 핵심 기능만 뽑아봤습니다.

 

1. ndarray: 파이썬 리스트보다 수만 배 빠른 이유

파이썬 리스트([1, 2, 3])는 유연하지만 느립니다. 반면 NumPy의 ndarray는 C언어로 구현되어 있어 엄청나게 빠르고 메모리도 적게 씁니다. 대용량 유전체 데이터나 고해상도 MRI 영상을 처리할 때 리스트를 쓰면 하루 종일 걸리지만, NumPy를 쓰면 순식간입니다.

  • 리스트: [1, "A", 3.5] (타입 섞임 가능 -> 느림)
  • ndarray: array([1, 2, 3]) (모두 같은 타입 -> 초고속 연산)
import numpy as np

# 리스트로 행렬 만들기 (비효율적)
list_data = [[120, 80], [110, 70]]

# NumPy ndarray로 변환 (효율적)
# 환자 2명의 [수축기, 이완기] 혈압 데이터
bp_data = np.array([[120, 80], 
                    [110, 70]])

print(f"데이터 타입: {type(bp_data)}") # <class 'numpy.ndarray'>
print(f"데이터 모양: {bp_data.shape}") # (2, 2) -> 2명, 2개 항목

 

2. 배열 생성과 초기화 (feat. zeros, ones)

딥러닝 모델의 가중치(Weight)를 초기화하거나, 마스크(Mask) 이미지를 만들 때 자주 씁니다.

  • np.zeros(): 0으로 가득 찬 배열 생성 (초기값 설정 등)
  • np.ones(): 1로 가득 찬 배열 생성
  • np.full(): 원하는 값으로 채움
# MRI 영상에서 '배경'을 0(검은색)으로 초기화한 마스크 생성 (10x10 크기)
mask = np.zeros((10, 10)) 

# 모든 환자의 초기 리스크 점수를 1로 설정 (5명)
risk_scores = np.ones(5)

# 결측치를 채우기 위해 -1로 가득 찬 배열 생성 (3x3)
missing_fill = np.full((3, 3), -1)

 

3. 모양 바꾸기 (reshape) - 가장 중요! 

데이터의 개수는 유지하면서 차원만 바꾸는 기술입니다. 예를 들어, (환자 수, 시간, 측정값) 형태의 3차원 데이터를 머신러닝 모델에 넣기 위해 (환자 수, 특징) 형태의 2차원으로 바꿀 때 씁니다.

# 1시간 간격으로 12번 측정한 혈당 데이터 (총 12개)
glucose = np.arange(12) 
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

# 이것을 (4명의 환자 x 3번 측정) 형태로 변경
reshaped_glucose = glucose.reshape(4, 3)
print(reshaped_glucose)
# [[ 0  1  2]  -> 환자 1
#  [ 3  4  5]  -> 환자 2
#  [ 6  7  8]  -> 환자 3
#  [ 9 10 11]] -> 환자 4

 

4. 브로드캐스팅 (Broadcasting) 

모양이 다른 배열끼리 연산할 때, NumPy가 알아서 크기를 맞춰주는 기능입니다. "모든 환자의 수축기 혈압에서 10을 빼고 싶다"면? 반복문 없이 그냥 빼면 됩니다.

# 환자 3명의 혈압
bp = np.array([130, 120, 140])

# 모든 환자의 혈압을 10씩 낮춤 (보정)
adjusted_bp = bp - 10 
# 결과: array([120, 110, 130])

 

더 복잡한 예시로, [수축기, 이완기] 각각에 다른 보정값을 적용하고 싶다면?

data = np.array([[120, 80], [130, 90]]) # (2, 2)
bias = np.array([5, -5]) # (2,) -> 수축기는 +5, 이완기는 -5

# (2, 2) + (2,) 연산 -> (2,)가 자동으로 (2, 2)로 확장되어 연산됨
result = data + bias

 

5. 인덱싱과 슬라이싱 (Boolean Indexing) 

데이터 분석의 꽃이죠. 조건에 맞는 데이터만 쏙 뽑아내는 기술입니다.

  • 기본 인덱싱: arr[행, 열]
  • Boolean Indexing: arr[조건] (조건이 True인 것만 추출)
# 데이터 중 '고혈압 위험군' 추출하기
# 0번째 열(수축기 혈압)이 130 이상인 환자 찾기
high_risk_patients = adjusted_data[adjusted_data[:, 0] >= 130]

 

6. 데이터 저장과 불러오기 (save, load) 

힘들게 전처리한 데이터를 날리면 안 되겠죠? NumPy 전용 포맷(.npy, .npz)으로 저장하면 CSV보다 훨씬 빠르게 읽고 쓸 수 있습니다.

  • np.save('filename', arr): 1개 배열 저장 (.npy)
  • np.savez('filename', key=arr1, key2=arr2): 여러 개 배열 저장 (.npz)
  • np.load('filename.npy'): 불러오기

요약: 이것만 기억하세요!

  1. np.array: 리스트 말고 이걸 쓰세요. (속도, 메모리 최적화)
  2. reshape: 데이터 모양을 자유자재로 바꾸는 연습을 많이 하세요. (-1 활용!)
  3. Broadcasting: 차원이 달라도 연산이 된다는 점을 적극 활용하세요.
  4. Boolean Indexing: 조건문 없이 arr[arr > 0] 처럼 데이터를 필터링하세요.

'Study Note > Deep Learning' 카테고리의 다른 글

딥러닝 실전! 텐서 곱셈(Matmul) 완벽 정리  (0) 2026.01.05
딥러닝을 위한 '텐서'와 '행렬'의 정체  (1) 2026.01.02
[PyTorch] 의료 데이터를 위한 텐서(Tensor) 완전 정복  (1) 2025.12.31
[PyTorch 기초] 의료 데이터를 텐서(Tensor)로 만드는 법  (1) 2025.12.30
딥러닝의 그릇 '텐서(Tensor)'와 도구 '파이토치'  (0) 2025.12.30
    'Study Note/Deep Learning' 카테고리의 다른 글
    • 딥러닝 실전! 텐서 곱셈(Matmul) 완벽 정리
    • 딥러닝을 위한 '텐서'와 '행렬'의 정체
    • [PyTorch] 의료 데이터를 위한 텐서(Tensor) 완전 정복
    • [PyTorch 기초] 의료 데이터를 텐서(Tensor)로 만드는 법
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바