Python
[Python] List Comprehension 으로 matrix 다루기
Acdong
2020. 10. 9. 21:03
728x90
-
Python은 특유의 간결성이 최대의 장점
-
Vector와 같은 수학 연산을 복잡하게 표현한다면 사용이 어려움
-
최대한 파이썬만의 특징을 살려서 간단하게 연산을 표시
-
Comprehension 과 zip 같은 pythonic technique을 적극 활용
Vector의 계산
Sum
백터의 합
u = [ 2, 2]
v = [ 2, 3]
z = [ 3, 5]
result = [ sum(t) for in zip(u,v,z)]
print(result)
- > [ 7 , 10 ]
Scalar - vector product
스칼라와 백터의 계산
u = [1,2,3]
v = [4,4,4]
alpha = 2
result = [alpha*sum(t) for t in zip(u,v)]
print(result)
-> [ 10 , 12, 14 ]
Matrix 의 계산
Matrix addition
matrix_a = [[3,6],[4,5]]
matrix_b = [[5,8],[6,7]]
result = [[sum(row) for row in zip(*t)] for t in zip(matrix_a , matrix_b)]
print(result)
뒤에 포문이 실행되어 -> *t 로 들어온다.
[t for t in zip(matrix_a , matrix_b)]
뒤에 포문을 먼저 해석해보면
결과가 일단
[([3,6] , [5,8]),([4,5] , [6,7])] 가 나온다.
첫 번째 반복에서
matrix_a 의 첫 번째 값과 matrix_b 의 첫 번째 값이 서로 묶여 튜플형태로 반환된다. ( zip 함수의 특징 )
두 번째 반복에서
matrix_a 의 두 번째 값과 matrix_b 의 두 번째 값이 서로 묶여 튜플형태로 반환.
t을 언패킹(*t) 한 것을 다시 zip() 으로 묶어서 튜플로 반환
[ [row for row in zip(*t)] for t in zip(matrix_a , matrix_b)]
t를 언패킹 하면 ( * t )
3,5
6,8
이런식으로 하나의 값들이 튀어나오고
이걸다시 zip으로 묶어 튜플로 만들어준다.
(3,5) , (6,8)
[ [sum(row) for row in zip(*t)] for t in zip(matrix_a , matrix_b)]
그래서 이것들을 다시 sum( ) 스켜주면 행렬의 덧셈이 깔끔하게 한줄로 정리된다.
Scalar - Matrix Product
스칼라와 행렬의 곱
matrix_a = [[3,6],[4,5]]
alpha = 4
result = [[alpha * element for element in t] for t in matrix_a]
print(result)
[[12, 24] , [16,20]]
Matrix Transpose
행렬의 트랜스포즈
matrix_a = [[1,2,3],[4,5,6]]
result = [[element for element in t] for t in zip(*matrix_a) ]
print(result)
[[1,4],[2,5],[3,6]]
Matrix Product
행렬의 곱
matrix_a = [[1,1,2],[2,1,1]]
matrix_b = [1,1],[2,1],[1,3]]
result = [[sum(a * b for a,b in zip(row_a,column_b))
for column_b in zip(*matrix_b)] for row_a in matrix_a]
print(result)
행렬곱은 이해하기 어려우니 개념만 알고 있도록 하자!!
반응형