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)

행렬곱은 이해하기 어려우니 개념만 알고 있도록 하자!!

 

 

반응형