행렬 곱셈은 선형 대수학의 기본 연산입니다.
우리는 일반적으로 이미지 처리, 기계 학습 등과 같은 수많은 응용 프로그램에서 사용합니다. NumPy는 과학 컴퓨팅을 위한 주목할만한 Python 패키지입니다.
하지만 이 게시물에서는 NumPy를 사용하지 않고 Python에서 행렬 곱셈을 수행하는 다양한 방법을 살펴보겠습니다.
우리는 활용할 것입니다 중첩 된 루프, 내장 map() 함수 및 목록 이해.
또한 각 전략의 장단점과 각 전략을 언제 적용해야 하는지 살펴보겠습니다. 선형 대수를 처음 접하고 행렬 곱셈에 대해 자세히 알고 싶은 경우; 계속 읽으세요.
행렬 곱셈은 어디에 사용합니까?
행렬 곱셈은 다음에서 사용됩니다. 컴퓨터 그래픽 2D 및 3D 영상을 변경합니다. 예를 들어 화면에서 개체를 회전, 크기 조정 및 변환할 수 있습니다. 매트릭스는 이미지 처리에서 사진을 픽셀 배열로 나타내는 데 사용됩니다. 게다가 매트릭스는 이미지 필터링과 같은 작업을 수행하는 데 사용될 수 있습니다.
우리는 또한 매트릭스를 사용합니다. 기계 학습. 데이터 및 모델 매개변수를 나타내는 데 도움이 될 수 있습니다. 컴퓨팅 내적 및 행렬-벡터 곱과 같은 수많은 작업을 수행할 수 있습니다.
확실히 이 작업은 과학적 작업에서도 매우 유리합니다. 물리량을 설명하기 위해 물리 및 공학에서 사용할 수 있습니다. 따라서 벡터와 텐서로 연산할 수 있습니다.
NumPy를 사용하지 않는 이유는 무엇입니까?
NumPy는 파이썬 라이브러리, 행렬 곱셈에 항상 이상적인 옵션은 아닙니다. 크기 및 종속성, 학습 및 레거시 시스템과 같은 이유로 NumPy를 사용하지 않을 수도 있습니다.
경우에 따라 Python의 내장 함수를 사용하거나 사용자 지정 코드를 개발하는 것이 더 효율적일 수 있습니다. 그러나 NumPy는 강력한 라이브러리라는 점에 유의해야 합니다. 게다가 행렬 곱셈에도 사용할 수 있습니다.
이제 NumPy 없이 행렬 곱셈을 수행하는 방법을 살펴보겠습니다.
중첩 루프 방법
중첩 루프 기술은 중첩 루프를 사용하여 Python에서 행렬 곱셈을 실행합니다. 이 함수는 각 행렬 요소를 반복합니다. 그리고 일련의 중첩 루프를 사용하여 곱합니다. 이 함수는 새 행렬에 저장된 결과를 반환합니다.
이 접근 방식은 이해하기 쉽습니다. 그러나 특히 더 큰 행렬의 경우 다른 방법만큼 효율적이지 않을 수 있습니다. 그러나 선형 대수학을 처음 접하는 경우 훌륭한 선택입니다.
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# 결과 행렬을 XNUMX으로 설정합니다.
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
이를 수행하는 방법에 대한 예를 들어 보겠습니다. 아래 코드 줄을 추가하여 이 예제를 테스트할 수 있습니다.
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
혜택 :
- 이해하기 쉽습니다.
- 초보자나 행렬 곱셈에 대한 더 깊은 이해를 원하는 사람들에게 좋습니다.
단점 :
- 특히 더 큰 매트릭스의 경우 대체 기술만큼 효과적이지 않습니다.
- 대체 접근 방식만큼 읽기 쉽지 않습니다.
map() 함수 메서드
map() 함수 메서드는 Python에서 행렬 곱셈을 수행하기 위한 대체 접근 방식을 제공합니다. 이 접근 방식에서는 내장된 map() 함수를 사용합니다. 따라서 제공된 함수를 반복 가능한 각 요소(목록, 튜플 등)에 적용하는 기능적 프로그래밍 도구를 사용합니다. 또한 map() 함수는 함수와 반복 가능한 두 개의 매개 변수를 허용합니다. 그리고 반복 가능한 각 요소에 함수를 적용하는 반복자를 반환합니다.
이 접근 방식에서는 행렬의 각 구성원을 살펴보고 중첩된 map() 함수를 사용하여 곱셈을 수행합니다.
zip() 함수는 행렬의 각 요소를 병렬로 반복하는 데 사용됩니다.
마지막으로 sum() 함수는 결과를 합산하는 데 사용됩니다.
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
이제 다시 예제로 코드를 테스트할 수 있습니다.
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
장점
- 누적 루프 접근 방식보다 더 효과적
- 함수형 프로그래밍을 사용하여 코드를 더 간단하게 만듭니다.
단점
- 함수형 프로그래밍에 익숙하지 않은 사람들은 가독성이 떨어질 수 있습니다.
- 중첩 루프 기술보다 이해하기 어렵습니다.
목록 이해 방법
List Comprehension을 사용하면 한 줄의 코드로 새 목록을 생성할 수 있습니다. 따라서 이것은 기존 목록의 각 구성원에 식을 적용하는 것입니다.
이 접근 방식에서 곱셈은 각 행렬 구성원을 반복적으로 반복하여 수행됩니다. 우리는 계층화된 목록 이해를 사용하고 있습니다.
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
장점
- map() 함수 메서드에 비해 더 짧고 읽기 쉽습니다.
단점
- 특히 큰 행렬의 경우 map() 함수를 사용하는 것보다 덜 효과적일 수 있습니다.
- 중첩 루프 방식보다 어렵습니다.
결론
이 게시물에서는 Python에서 행렬을 곱할 때 NumPy를 사용하는 대안을 살펴보았습니다. 중첩 루프, 내장 map() 함수 및 목록 이해에서 행렬 곱셈을 수행했습니다.
최상의 전략은 프로젝트의 특정 요구 사항에 따라 달라집니다.
각 전략에는 장단점이 있습니다. 함수가 제대로 작동하는지 확인하려면 다양한 행렬 차원 및 값을 사용하여 몇 가지 테스트 사례를 추가하는 것이 좋습니다.
또한 이러한 메서드가 얼마나 잘 실행되는지 비교하기 위해 몇 가지 성능 테스트를 포함해야 합니다.
댓글을 남겨주세요.