비버놀로지

[선형대수학 Numpy] Numpy 논리연산자 본문

인공지능 머신러닝

[선형대수학 Numpy] Numpy 논리연산자

KUNDUZ 2022. 11. 3. 08:55
728x90

NumPy 논리연산자

앞으로 보다 쉽게 행렬을 입력할 수 있도록 다음과 같은 방법으로 배열을 입력받겠습니다.

  1. 먼저 행렬의 크기를 입력받습니다. 행의 수와 열의 수를 의미하는 두 정수를 받습니다. 두 개의 숫자는 공백으로 나누어집니다.
  2. 그다음 한 줄에 열의 수만큼의 숫자가 입력됩니다.
  3. [행의 수] 만큼의 줄이 입력되고 총 [행의 수] ×\times [열의 수] 만큼의 숫자를 입력받게 됩니다.
3 5
1 2 6 3 8
11 0 -1 3 1
9 0 7 -3 4

np.transpose()

transpose() 또는 T를 이용하면 전치행렬을 구할 수 있습니다. 행렬의 (i,j)(i, j) 번째 원소를 (j,i)(j, i)번째 원소로 변환합니다.

>>> A = np.array([[1, 2, 3], [4, 5, 6]])
>>> print(A.T)
[[1 4]
 [2 5]
 [3 6]]

np.linalg.inv

inv()는 행렬의 역행렬(inverse)를 구할 때 사용됩니다. NumPy의 선형대수학 관련 세부 패키지 linalg를 사용하기 때문에, 조금 더 긴 명령어를 사용합니다.

>>> A = np.array([[1, 2], [3, 4]])
>>> print(np.linalg.inv(A))

np.dot

dot()은 두 행렬의 곱셈, 혹은 두 벡터의 내적(dot product)을 구할 때 사용됩니다. 이때 두 행렬의 크기 또는 shape이 맞지 않으면 오류가 발생합니다.

>>> A = np.array([[1, 2, 3], [1, 2, 1]])
>>> B = np.array([[2, 1, 3], [-1, 0, 5]])
>>> C = np.dot(A, B)
'ValueError: shapes (2,3) and (2,3) not aligned'
>>> B = B.transpose()
>>> C = np.dot(A, B)
>>> print(C)
[[13 14]
 [ 7  4]]
 

실습

지금까지 배운 행렬 사용 방법을 모두 응용해보겠습니다.

  1. 앞으로 자주 사용될 get_matrix() 함수를 살펴보고 동작 방법을 숙지하세요.
  2. A의 전치행렬(transpose) B를 생성하세요.
  3. B의 역행렬을 구하여 C에 저장하세요. 역행렬을 구하는 것이 불가능하면 문자열 "not invertible"을 리턴합니다.
  4. matrix_tutorial() 함수의 리턴값으로 0보다 큰 C의 원소를 모두 세어 개수를 리턴하세요. sum()의 인자로 해당 조건 C > 0을 입력하면 0보다 큰 원소를 쉽게 셀 수 있습니다.
  5. 행렬을 자유롭게 설정하고 결괏값을 확인해보세요.

Tips!

try/except문으로 예외 처리를 할 수 있습니다. 에러가 발생할 것 같은 코드를 try안에 넣고, except안에는 에러 발생 시 실행될 동작 코드를 넣으면, 에러가 발생해도 프로그램이 멈추지 않고 별도 처리가 가능합니다.

try:
    C = None
except:
    return None

 

import numpy as np

def main():
    A = get_matrix()
    print(matrix_tutorial(A))

def get_matrix():
    mat = []
    [n, m] = [int(x) for x in input().strip().split(" ")]
    for i in range(n):
        row = [int(x) for x in input().strip().split(" ")]
        mat.append(row)
    return np.array(mat)

def matrix_tutorial(A):
    
    # 아래 코드를 완성하세요.
    B = A.transpose()
    C = None
    try:
        C = np.linalg.inv(B)
    except:
        return "not invertible"
    print(C)
    return np.sum(C>0)

if __name__ == "__main__":
    main()

 

 

 

728x90
Comments