Python/Pythonic Code

Pythonic Code #3 (Linear Algebra_vector and matrix)

emilia park 2023. 4. 3. 23:34
728x90

앞에 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 정리는 끝이당,,

그래도 나름 규칙만 잘 이해하면 머리 속에 잘 들어오는 느낌이다!! 

이상-!

 

 

 

 

728x90