파이썬

0710 Numpy

인뽕 2026. 7. 10. 09:48

 

 

#Numpy

 

- 넘파이는 파이썬에서 수치를 계산하는 라이브러리이다. 머신러닝과 데이터 과학 분야에서 넘파이는 필수이다.

머신러닝의 모든 데이터는 결국 숫자로 이루어진 행렬로 표현되며, 넘파이는 이 대규모 행렬 연산을 압도적인 속도로 처리해 주는 핵심 라이브러리이다.

 

# 머신러닝 코드를 작성하거나 논문을 구현할 때 가장 자주 쓰이는 핵심 기능

 

1. 다차원 배열 생성

 

'''
머신러닝에서 데이터셋은 대개 2차원(행과 열) 또는 3차원(이미지: 가로, 세로, 채널) 배열.

np.array(): 리스트를 NumPy 배열로 변환

np.zeros(), np.ones(): 0 또는 1로 채워진 가중치(Weights) 초기화 시 사용

np.arange(): 일정 간격의 수열 생성 (인덱싱이나 루프 제어 시 유용)
'''
###-----------------------------------------------------------------
import numpy as np

# 2차원 데이터셋 예시 (샘플 2개, 특성 3개)
X = np.array([[1.0, 2.0, 3.0], 
              [4.0, 5.0, 6.0]])

 

2. 차원과 모양 변경 (Reshaping)

 

'''

머신러닝 모델에 데이터를 입력할 때
가장 에러가 많이 나는 부분이 바로 데이터의 '모양(Shape)'이 맞지 않을 때.

X.shape: 배열의 구조(차원) 확인 
(예: (100, 32, 32) -> 100장의 32x32 이미지)

X.reshape(): 데이터의 개수는 유지하되 차원을 변경 
(예: 2D 이미지를 1D로 평탄화)

Tip: -1을 넣으면 남은 차원으로부터 크기를 자동으로 계산. 
X.reshape(-1, 1)은 머신러닝 레이블 벡터를 만들 때
'''
#----------------------------------------------
# 2x3 배열을 6x1 배열로 변환
X_reshaped = X.reshape(-1, 1)

-1의 의미 : "이 자리의 크기는 너가 알아서 계산해"

2x3 배열이므로 reshape(-1,1)을 하면 열 크기를 1로 고정해서 자동으로 6행 1열이 된다.

 

3. 브로드캐스팅 (Broadcasting)

 

'''

머신러닝에서 모든 데이터 샘플에 동일한 연산
(예: 평균 빼기, 스케일링)을 적용할 때 루프를 돌릴 필요가 없다. 
NumPy는 서로 모양이 다른 배열 간의 연산을 자동으로 확장해서 처리!
'''
#----------------------------------------------
# 모든 데이터에 일괄적으로 편향(Bias) 더하기
biases = np.array([0.5, 1.0, 1.5])
result = X + biases  # 각 행에 biases가 알아서 더해짐

#행이 맞지않아도 자동으로 더해짐

biases를 X의 행에 각각 더해준다.

 

4. 벡터 및 행렬 연산 (Linear Algebra)

 

'''

딥러닝의 핵심은 행렬 곱(Dot Product). 
신경망(CNN)의 순전파(Forward) 연산은 대부분 행렬 곱으로 이루어진다.
순전파는 정방향으로 가는거 ->
역전파는 역방향으로 가는거 <-
np.dot(A, B) 또는 A @ B: 행렬 곱셈 (내적)

A.T: 전치 행렬 (Transposed Matrix, 행과 열을 바꿈)
'''
#----------------------------------------------
W = np.array([[0.1, 0.2], 
              [0.3, 0.4], 
              [0.5, 0.6]]) # 가중치 행렬 (3x2)

# 행렬 곱 연산 (2x3) @ (3x2) = (2x2)
output = X @ W

 

반가운 행렬이 나왔다. 수학 조교할떄가 생각나는군!

 

5. 집계 함수와 축(Axis) 개념 

 

'''

손실 함수(Loss Function)를 계산하거나 
데이터의 특성별 평균을 구할 때 사용. 
axis 개념을 정확히 이해하는 것이 중요!!!!!

axis=0: 열(Column) 기준 연산 
(행을 따라 내려가며 연산 -> 각 특성별 평균)

axis=1: 행(Row) 기준 연산 
(열을 가로지르며 연산 -> 각 샘플별 합계)
'''
#----------------------------------------------
# 각 특성(열)별 평균 계산 -> 머신러닝 정규화(Normalization)의 기초
mean = np.mean(X, axis=0)

 

6. 조건문과 인덱싱 (Filtering)

 

'''

데이터셋에서 특정 조건(예: 이상치 제거, 특정 클래스 추출)을 만족하는 
데이터만 뽑아낼 때 사용.

불리언 인덱싱(Boolean Indexing): 조건식의 결과가 True인 요소만 추출

np.where(조건, 참일 때 값, 거짓일 때 값): 조건에 따른 데이터 수정 또는 인덱스 찾기
'''
#----------------------------------------------

# 3보다 큰 데이터만 추출
filtered_X = X[X > 3]

# 3보다 큰 값은 1로, 나머지는 0으로 변환 (이진 분류 레이블링 등에 유용)
binary_labels = np.where(X > 3, 1, 0)

 

where은 삼항연산자랑 똑같음

 

 

#행렬

 

# 1. 전치 행렬 (Transpose, .T)
"""

"가로줄과 세로줄을 통째로 맞바꾸기"

머신러닝에서는 데이터의 형태(shape)를 맞추기 위해 행렬을 휙 돌려야 할 때가 정말 많다. 
가로(행)를 세로(열)로, 세로(열)를 가로(행)로 뒤집는 것을 전치

결과: 원래 [1, 2, 3]이었던 가로줄이 세로줄 [1, 2, 3]으로 변경
"""
#----------------------------------------------

import numpy as np

# 2행 3열짜리 행렬 생성
A = np.array([[1, 2, 3],
              [4, 5, 6]])

# .T를 붙여서 뒤집기
A_transposed = A.T

print("원본 A (2x3):\n", A)
print("전치 후 A.T (3x2):\n", A_transposed)





#----------------------------------------------
# 2. 행렬 곱 (Dot Product, @)
"""

"앞 행렬의 가로줄과 뒤 행렬의 세로줄을 교차하며 곱하고 더하기"

인공지능 신경망이 '예측'을 할 때 입력 데이터와 가중치(Weight)를 곱하는 핵심 연산. 
일반 곱셈(*)처럼 원소끼리 그냥 곱하는 게 아니라, 가로와 세로를 교차하며 곱해 합산.

규칙: 앞 행렬의 가로 길이와 뒤 행렬의 세로 길이가 반드시 같아야 연산이 가능!! 
((2x3) @ (3x2) = (2x2))

계산 원리: 결과 창의 첫 번째 칸은 (1*1) + (2*3) + (3*5) = 22
"""
#----------------------------------------------

# 2행 3열 행렬 (예: 데이터 2개)
X = np.array([[1, 2, 3],
              [4, 5, 6]])

# 3행 2열 행렬 (예: 가중치)
W = np.array([[1, 2],
              [3, 4],
              [5, 6]])

# 행렬 곱 실행
result = X @ W

print("행렬 곱 결과 (2x2):\n", result)

 

 


 

 

#머신러닝 데이터 처리

 

#----------------------------------------------------------------
# 요약하자면,
# 머신러닝 데이터 처리는
# ".T로 돌리고,
# @로 곱하고,
# 브로드캐스팅으로 알아서 맞춰 더한 뒤,
# axis로 원하는 방향의 평균을 내는 과정"의 반복
#----------------------------------------------------------------

#----------------------------------------------
# 이미지 분석할때

'''
1. 컴퓨터에게 이미지는 그냥 '숫자 행렬'이다
   우리 눈에는 예쁜 사진으로 보이지만, 
   컴퓨터는 이미지를 거대한 숫자 바둑판(행렬)으로 인식.
   가로 세로 픽셀마다 밝기나 색상(0~255)이 숫자로 채워져 있다.
   예를 들어, 가로 28픽셀, 세로 28픽셀짜리 작은 손글씨 이미지는 
   컴퓨터에게 28 X 28 크기의 행렬일 뿐이다.
   
2. 이미지 분석의 핵심: 특징 추출 (합성곱, Convolution)
   이미지를 분석하려면 사물의 '테두리(선)', '색상의 변화', '특정 모양' 같은 특징을 찾아내야 한다. 
   이때 인공지능은 필터(Filter 또는 Kernel)라고 불리는 
   작은 돋보기 행렬을 사용하는데, 
   여기서 바로 행렬곱이 쓰인다.
   도장 찍기: 이미지 행렬 위에 작은 필터 행렬(예:3X3)을 포갠다.
   행렬곱 연산: 포개어진 부분의 이미지 숫자들과 필터의 숫자들을 순서대로 곱하고 모두 더한다.
   (우리가 방금 배운 그 행렬곱 방식입니다!)
   특징 맵 생성: 이 돋보기를 옆으로, 아래로 한 칸씩 이동하며 이미지 전체에 도장을 찍으면, 
   특정 특징(예: 세로선)만 뚜렷하게 강조된 새로운 행렬이 만들어진다.
   
   💡 딥러닝에서 이미지 분석에 최고로 꼽히는 
   **CNN(합성곱 신경망)**의 '합성곱'이 바로 이 필터를 이용한 행렬곱 연산을 의미.  
   
3. 최종 판단: 분류 (Fully Connected Layer)
필터를 통해 이미지에서 
"고양이 귀 모양", "고양이 수염 모양" 같은 특징들을 다 뽑아내고 나면, 
인공지능은 마지막으로 "그래서 이 사진이 고양이일 확률이 몇 %인가?"를 계산해야 한다.

이때도 마찬가지로 
추출된 특징 데이터 행렬과 
인공지능이 학습한 가중치(Weight) 행렬을 
최종적으로 거대하게 행렬곱(@) 하여 
"고양이: 98%, 강아지: 2%" 같은 결론을 도출한다.
'''
#----------------------------------------------

#----------------------------------------------------------------
# 요약하자면,
# 컴퓨터가 이미지를 분석하는 과정은
# "이미지 행렬에
# 필터 행렬을 계속 곱해서(@)
# 중요한 특징을 짜낸 후,
# 마지막 행렬곱을 통해
# 정답을 맞추는 과정"이라고 볼 수 있다.   
#----------------------------------------------------------------

'파이썬' 카테고리의 다른 글

0714 ML/DL(2)  (0) 2026.07.14
0713 ML/DL  (0) 2026.07.13
0709 파이썬 기초 문법 복습  (0) 2026.07.09
0708 데이터 분석 및 시각화  (0) 2026.07.09
0707 Pandas  (0) 2026.07.09