Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 두 행렬의 요소별 차이 구하기

두 행렬(리스트의 리스트)의 요소별(element-wise) 차이를 구해 출력해야 하는 경우, 리스트의 요소를 하나씩 반복하면서 zip 메서드를 활용하면 간단하게 해결할 수 있습니다.

예제

다음은 두 행렬의 요소별 차이를 계산하는 전체 코드입니다.

my_list_1 = [[3, 4, 4], [4, 3, 1], [4, 8, 3]]
my_list_2 = [[5, 4, 7], [9, 7, 5], [4, 8, 4]]

print("첫 번째 리스트 :")
print(my_list_1)
print("두 번째 리스트 :")
print(my_list_2)

my_result = []

for sub_list_1, sub_list_2 in zip(my_list_1, my_list_2):
    temp_list = []
    for element_1, element_2 in zip(sub_list_1, sub_list_2):
        temp_list.append(element_2 - element_1)
    my_result.append(temp_list)

print("결과 :")
print(my_result)

실행 결과

첫 번째 리스트 :
[[3, 4, 4], [4, 3, 1], [4, 8, 3]]
두 번째 리스트 :
[[5, 4, 7], [9, 7, 5], [4, 8, 4]]
결과 :
[[2, 0, 3], [5, 4, 4], [0, 0, 1]]

코드 설명

  • 두 개의 중첩 리스트(행렬)를 정의하고 콘솔에 출력합니다.
  • 결과를 저장할 빈 리스트 my_result를 생성합니다.
  • zip 메서드로 두 행렬을 같은 위치끼리 묶은 뒤, 바깥쪽 for 루프에서 행 단위로 순회합니다.
  • 내부 for 루프에서는 각 행의 대응하는 요소끼리 다시 zip으로 묶어, 두 번째 행렬의 값에서 첫 번째 행렬의 값을 뺀 차이를 임시 리스트에 추가합니다.
  • 한 행의 계산이 끝날 때마다 임시 리스트를 결과 리스트에 추가(append)합니다.
  • 모든 반복이 끝나면 최종 결과 행렬이 콘솔에 출력됩니다.

더 간결한 방법: 리스트 컴프리헨션

위의 중첩 루프는 리스트 컴프리헨션(list comprehension)을 사용하면 한 줄로 표현할 수 있습니다.

my_result = [[e2 - e1 for e1, e2 in zip(row1, row2)]
             for row1, row2 in zip(my_list_1, my_list_2)]
print(my_result)  # [[2, 0, 3], [5, 4, 4], [0, 0, 1]]

NumPy를 활용한 방법

대규모 수치 연산을 다룬다면 NumPy 배열로 변환해 연산하는 것이 더 효율적입니다.

import numpy as np

result = np.array(my_list_2) - np.array(my_list_1)
print(result)
# [[2 0 3]
#  [5 4 4]
#  [0 0 1]]