Pythonic Code #3 (Linear Algebra_vector and matrix)
앞에 step에서 Pythonic code 들에 대해서 알아보았다.
이번 step에서는 pythonic code를 활용한 Linear algebra(선형대수학) 과 그의 기본인 vector, matrix 표현법에 대해서 정리해보려고 한다.
[Linear Algebra]
'선형대수학'
- 선형 : 직선 또는 그와 비슷한 성질을 가진 대상
- 대수학 : 문자에 숫자를 대입하여 푸는 문제
- 벡터(vector), 행렬(matrix), 연립 선형 방정식 등을 연구하는 대수학의 한 분야이다.
a) Vector
- 배달/운반하다의 의미를 가진 단어가 어원이다.
- 크기와 방향을 모두 가진다. (크기만 가지면 scalar)
- 파이썬에서 vector는 list라고 보면 된다. (물론, dict type/tuple type 모두 가능하다.)
##### Vector
a = [1,2,10] #list type
b = (1,2,10) #tuple type
c = {'x':1, 'y':2, 'z':10} #dict type
##### vecter calculation(addition)
#general list append
u = [2,2]
v = [2,3]
z = [3,5]
result = []
for i in range(len(u)):
result.append(u[i] + v[i] + z[i])
print(result)
#출력
# [7,10]
#list comprehension
u = [2,2]
v = [2,3]
z = [3,5]
result = [ sum(t) for t in zip(u,v,z) ]
print(result)
#출력
# [7,10]
##### Vector calculation(subtraction)
u =[2,2]
v = [2,3]
z = [3,5]
[t[0]*2-sum(t) for t in zip(u,v,z)]
#출력
# [-3,-6]
b) Matrix
- 격자라는 의미를 가진 단어이다.
- 수학에서 사각형으로 된 수의 배열을 지칭한다.
- 한 개 이상의 vector 를 matrix라고 보면 된다.
##### Matrix
a = [[3,5],[2,5]] #list type
b = [(3,6),(4,5)] #tuple type
c = {(0,0):3, (0,1):6, (1,0):4, (1,1):5} #dict type
##### Matrix calculation(addition)
a = [[3,4],[4,5]]
b = [[4,5],[3,2]]
result = [rows for rows in zip(a,b)]
result
#출력
# [([3, 4], [4, 5]), ([4, 5], [3, 2])]
#zip특징 : tuple로 반환 --> 풀어주는 과정 필요 --> 'asterisk unpacking*'
result = [[sum(element) for element in zip(*rows)] for rows in zip(a,b)]
#출력
# [[7,9],[7,7]]
##### Matrix transpose
a = [[1,2,3],[2,3,5]]
a_t1 = [row for row in zip(*a)] #tuple
a_t1
#출력
# [(1,4),(2,3),(3,5)]
a_t2 = [list(row) for row in zip(*a)] #list
a_t2
#출력
# [[1,4],[2,3],[3,5]]
##### Matrix calculation(product)
# row_a 와 col_b를 zip 하여 각각의 성분들끼리 곱하고 합하기
a = [[1,2,3],[2,3,5]]
b = [[1,2],[2,4],[2,4]]
print([row_a for row_a in a]) #행 출력
print([col_b for col_b in zip(*b)]) #열 출력
[[[a*b for (a,b) in zip(row_a, col_b)] for col_b in zip(*b)] for row_a in zip(a)]
#출력
# [[[1, 4, 6], [2, 8, 12]], [[2, 6, 10], [4, 12, 20]]]
[[[sum(a*b) for (a,b) in zip(row_a, col_b)] for col_b in zip(*b)] for row_a in zip(a)]
#출력
# [[11, 22], [18, 36]]
이 아래부터는 list comprehension, zip, asterisk 등의 pythonic technique 를 활용하여 vector 와 matrix를 표현하려고 한다.
[Vector with Python]
a) vector_size_check : vector 간 덧셈 또는 뺄셈 연산시, 연산이 가능한 사이즈인지 확인하여 가능여부에 대해서 True or False 반환하는 함수.
*all 조건 : and 조건과 동일. 모두 True 여야 True 반환.
*any조건 : or 조건과 동일. 하나라도 True면 True 반환.
##### Vector size check
def vector_size_check(*vector_variables):
return all(len(vector_variables[0]) == x for x in [len(vector) for vector in vector_variables])
print(vector_size_check([1,3],[2,3],[6,7]))
#출력
# True
##### Vector size check (another method)
def vector_size_check(*vector_variables) :
return all( [len(vector_variables[0]) == len(vector) for vector in vector_variables[1:]])
print(vector_size_check([1,3],[2,3],[6,7]))
#출력
# True
b) vector_addition : vector 간 덧셈을 실행하여 결과 반환하는 함수.
##### Vector addition
def vector_addition(*vector_variables):
if vector_size_check(*vector_variables) == False:
raise ArithmeticError
return [sum(elements) for elements in zip(*vector_variables)]
result = ([1,3],[2,3],[3,4])
vector_addition(*result
#출력
# [6,10]
##### Vector addition(another method)
result = ([1,3],[2,3],[3,4])
[sum(value) for value in zip(*result)]
#출력
# [6,10]
c) vector_subtraction : vector 간 뺄셈을 실행하여 결과 반환하는 함수.
##### Vector subtraction (u-v-w)
def vector_subtraction(*vector_variables):
if vector_size_check(*vector_variables) == False:
raise ArithmeticError
return [element[0]*2-sum(element) for element in zip(*vector_variables)]
result = ([1,3],[2,3],[3,4])
vector_subtraction(*result)
#출력
# [-4,-4]
d) scalar_vector_product : 하나의 scalar 값을 vector에 곱하여 반환하는 함수.
##### Scalar vector product
def scalar_vector_product(alpha, vector_variables):
return [alpha*element for element in vector_variables]
print(scalar_vector_product(5,[1,2,3]))
#출력
# [5, 10, 15]
##### Scalar vector product(another method)
alpha = 5
result = [1,2,3]
[alpha*value for value in result]
#출력
# [5,10,15]
[Matrix with Python]
a) matrix_size_check : matrix 간 덧셈 또는 뺄셈 연산시, 연산이 가능한 사이즈인지 확인하여 가능여부에 대해서 True or False 반환하는 함수.
##### Matrix size check
def matrix_size_check(*matrix_variables):
#print([matrix for matrix in matrix_variables]) #matrix 행들로 분해
#print([len(matrix) for matrix in matrix_variables]) #행 count
#print([len(matrix) for matrix in zip(*matrix_variables)]) #열 count
#print([len(matrix[0]) for matrix in matrix_variables]) #첫 번째 행의 길이 확인(열 count)
#print(len(set([len(matrix) for matrix in matrix_variables])) == 1 )
# >> 두 matrix 의 행의 사이즈가 같은 지 확인, set 이용
#print(len(set([len(matrix) for matrix in zip(*matrix_variables)])) == 1 )
# >> 두 matrix 의 열의 사이즈가 같은지 확인, set 이용
#print(len(set([len(matrix[0]) for matrix in matrix_variables]))==1)
# >> 두 matrix 의 열의 사이즈가 같은지 확인, set 이용
return len(set([len(matrix) for matrix in matrix_variables]))==1 and len(set([len(matrix[0]) for matrix in matrix_variables])) ==1
x = [[1,2],[3,4]]
y = [[2,3],[1,3],[3,4]]
print(matrix_size_check(x,y))
#출력
# False
b) is_matrix_equal : matrix n개가 동치인지 확인하는 함수. (size and element)
##### Matrix equal (size and element)
def is_matrix_equal(*matrix_variables):
return all([all([len(set(row)) ==1 for row in zip(*matrix)]) for matrix in zip(*matrix_variables)])
#각각의 matrix의 행끼리 zip 해준 뒤 각 성분을 set으로 묶어서 성분이 하나인지 확인하는 것
x = [[2,3],[2,1]]
y = [[2,3],[2,2]]
print(is_matrix_equal(x,y))
#출력
# False
c) matrix_addition : vector 간 덧셈을 실행하여 결과 반환하는 함수.
##### Matrix addition
def matrix_addition(*matrix_variables):
if matrix_size_check(*matrix_variables) == False:
raise ArithmeticError
return [[sum(row) for row in zip(*matrix)] for matrix in zip(*matrix_variables)]
x = [[2,3],[2,1]]
y = [[2,4],[2,2]]
print(matrix_addition(x,y))
#출력
# [[4,7],[4,3]]
d) matrix_subtraction : vector 간 뺄셈을 실행하여 결과 반환하는 함수.
##### Matrix subtraction
def matrix_subtraction(*matrix_variables):
if matrix_size_check(*matrix_variables) == False:
raise ArithmeticError
return [[row[0]*2 - sum(row) for row in zip(*matrix)] for matrix in zip(*matrix_variables)]
x = [[2,3],[2,1]]
y = [[2,3],[2,2]]
print(matrix_subtraction(x,y))
#출력
# [[0, 0], [0, -1]]
e) matrix_transpose : matrix 의 transpose를 구하여 결과 반환하는 함수.
##### Matrix transpose
def matrix_transpose(matrix_variables) :
return [list(row) for row in zip(*matrix_variables)]
#return [[element for element in row] for row in zip(*matrix_variables)]
w = [[2,3],[4,5],[2,1]]
matrix_transpose(w)
#출력
# [[2, 4, 2], [3, 5, 1]]
f) is_product_availability_matrix : 두 matrix가 곱셈이 가능한지 판단하는 함수.
##### Matrix product availability
def is_product_availability_matrix(a,b):
return len([col_a for col_a in zip(*a)]) == len(b)
a = [[1,2,3],[2,3,4]]
b = [[2,3,4,5],[2,3,5,4]]
#출력
# False
g) matrix_product : matrix 곱 실행하는 함수.
##### Matrix product (row a * col b)
def matrix_product(a,b) :
return[[sum(a*b for a,b in zip(row_a, column_b)) for column_b in zip(*b)] for row_a in a]
a = [[1,2,3],[1,2,3]]
b = [[1,2],[2,3],[2,4]]
matrix_product(a,b)
내가 정리하면서도 너무 헷갈려서 여러 번 들여다보게 되었던 선형대수학 pythonic code정리도 끝!
이상으로 pythonic code 정리는 끝이당,,
그래도 나름 규칙만 잘 이해하면 머리 속에 잘 들어오는 느낌이다!!
이상-!