파이썬 NumPy 행렬 연산: 전치, 덧셈, 곱셈, 슬라이싱 실전 가이드
파이썬 NumPy 행렬 연산: 전치, 덧셈, 곱셈, 슬라이싱 실전 가이드
행렬이란?
수학적 모델링, 과학 계산, 데이터 분석은 종종 2차원 데이터 효율적 조작에 의존합니다. 파이썬에서 행렬은 일반 리스트로 만들 수 있지만, 더 강력하게는 NumPy 라이브러리로 생성합니다. 이 가이드는 가장 일반적인 행렬 연산을 명확한 코드 예제와 모범 사례 팁으로 안내합니다.
중첩 리스트로 행렬 만들기
중첩 리스트는 행렬 만드는 가장 간단한 방법. 각 내부 리스트가 한 행:
# 3x3 행렬
M1 = [[8, 14, -6], [12, 7, 4], [-11, 3, 21]]
print(M1)
출력: [[8, 14, -6], [12, 7, 4], [-11, 3, 21]]
데이터 읽기
행과 열 인덱스로 요소 접근. 각 행의 마지막 요소 출력:
for row in M1:
print(row[-1])
출력: -6 / 4 / 21
행렬 덧셈
두 행렬 모양 같으면 원소별 덧셈 직관적:
M2 = [[3, 16, -6], [9, 7, -4], [-1, 3, 13]]
# 결과 행렬
M3 = [[M1[i][j] + M2[i][j] for j in range(len(M1[0]))] for i in range(len(M1))]
print(M3)
출력: [[11, 30, -12], [21, 14, 0], [-12, 6, 34]]
원소별 곱셈
마찬가지로 대응 원소 곱셈:
M3 = [[M1[i][j] * M2[i][j] for j in range(len(M1[0]))] for i in range(len(M1))]
print(M3)
출력: [[24, 224, 36], [108, 49, -16], [11, 9, 273]]
NumPy로 효율적 행렬 연산
NumPy는 전용 배열 타입과 풍부한 벡터화 연산 제공. pip install numpy로 설치 후 np로 임포트:
import numpy as np
행렬 생성
M1 = np.array([[5, -10, 15], [3, -6, 9], [-4, 8, 12]])
print(M1)
출력: [[ 5 -10 15] [ 3 -6 9] [ -4 8 12]]
기본 연산
- 덧셈:
M3 = M1 + M2
- 뺄셈:
M3 = M1 - M2
- 내적 (행렬 곱셈):
M3 = M1.dot(M2)
- 전치:
M2 = M1.transpose()
예제: 행렬 내적
M1 = np.array([[3, 6], [5, -10]])
M2 = np.array([[9, -18], [11, 22]])
print(M1.dot(M2))
출력: [[ 93 78] [-65 -310]]
슬라이싱
array[row_start:row_end, col_start:col_end]로 행/열 슬라이싱:
M = np.array([[2, 4, 6, 8, 10],
[3, 6, 9, -12, -15],
[4, 8, 12, 16, -20],
[5, -10, 15, -20, 25]])
print(M[1:3, 1:4]) # 행 1~2, 열 1~3
print(M[:, 3]) # 모든 행, 4번째 열
print(M[:1, :]) # 첫 행, 모든 열
print(M[:3, :2]) # 처음 3행, 처음 2열
출력:
[[ 6 9 -12] [ 8 12 16]] / [ 8 -12 16 -20] / [[ 2 4 6 8 10]] / [[ 2 4] [ 3 6] [ 4 8]]
행과 열 접근
# 행
print(M[0]) # 첫 행
print(M[-1]) # 마지막 행
# 열
print(M[:, 0]) # 첫 열
print(M[:, -1]) # 마지막 열
핵심 요약
- 파이썬 리스트의 리스트는 소규모 행렬엔 적절하지만, NumPy
ndarray가 훨씬 잘 확장.
- 원소별 연산(+, -, *, /)이 NumPy 배열에서 직접 동작.
- 진정한 행렬 곱셈엔
np.dot() 또는 @ 연산자 사용.
- 슬라이싱으로 부분 행렬이나 특정 행/열 추출 강력 지원.
- 연산 전 행렬 모양 호환성 항상 확인.