두 행렬(리스트의 리스트)의 요소별(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]]