본문 바로가기

Hacks

(19)
Python ...의 쓰임 개요 Python 코드에서 bracket안에 종종 보이는 ...의 쓰임에 대해 알아보자. Python ...의 쓰임 Python 코드를 보면 가끔 아래와 같은 ... 표시를 볼 수 있다. 저게 정말 코드의 일부분인 걸까? 그렇다. 저 ...에는 2가지 쓰임이 있다. 1. Indexing 값 생략 ...을 이용하면 indexing을 할 때 모든 차원의 값을 써주지 않아도 indexing을 할 수 있게끔 해준다. 예를 들어, 3차원의 배열을 indexing 할 때, 특히 n차원 배열의 마지막 차원의 벡터들을 indexing 할 때 ...을 사용하면 조금 더 손쉽게 indexing을 수행할 수 있다. 즉, 2번째 라인이 보여주는 결과를 ...으로 생략하여 씀으로써 똑같이 보여줄 수 있다. 2. 배열의 deep..
Python numpy 및 tensor의 차원 열벡터, 행벡터 인덱싱 개요 Python의 numpy와 tensor를 indexing할 때 차원의 축과 행 방향으로 indexing 하는 방법을 알아보자. Numpy와 tensor의 indexing 먼저 아래와 같은 (2,2,5) shape을 가진 numpy의 배열이 있다고 가정하자. 필자는 이 배열을 표현할 때 다음과 같이 표현하려고 한다. "2개의 배치와 2개의 행 그리고 5개의 열을 가진 배열" 그렇다면 이때, 각 배치의 첫 번째 행벡터들을 indexing 하려면 어떻게 해야 할까? 1. 행벡터 indexing 그 방법은 바로 아래와 같은 코드를 작성하면 된다. 그러면 아래와 같은, 우리가 원했던 indexing을 수행할 수 있다. 2. 열벡터 indexing 그렇다면, 각 배치의 축 방향 벡터들, 열벡터들을 indexi..
@classmethod, @property 개요 데코레이터의 역할을 하는, @classmethod와 @property는 어떤 기능을 하는지 알아보자. 1. @classmethod 2. @property 3. 마무리 1. @classmethod @classmethod를 사용한 결과 직관적으로 그냥 바로 classmethod를 사용하면 어떻게 함수를 사용할 수 있는지 확인해보자. class Person: def __init__(self, name: str="Kang", age: int=20) -> None: self.name = name self.age = age @classmethod def cal_age(cls, year): # cls가 받는 것은 객체가 아닌 클래스 print(f"현재 나이: {cls(age=50).age}") return f"..
공백 입력이 들어왔을 때, while문 종료하기 while True: name = input("입력해주세요: ") if not name.strip(): print("아무 것도 입력하지 않았으므로, 종료합니다.") break else: print("계속 실행") print(name)
python 차원 이해하기 (with numpy) 개요 numpy의 numpy.zeros 메소드와 함께 배열을 만들 때 파악해야 하는 요소인 차원에 대해 알아보도록 하자. torch의 tensor 자료형에서도 써먹을 수 있다. 글에서는 numpy.zeros를 줄여서 편하게 np.zeros라고 사용하겠다. 그리고 shape에 들어가는 값에 따른 차원의 변화만을 알아볼 것이다! - np.zeros의 파라미터 각각의 기능에 대한 설명은 아래의 사이트를 참고하자. https://aigong.tistory.com/62 numpy.zeros, numpy.zeros_like 알아보기 numpy zeros, zeros_like 알아보기 우리는 간혹 0으로 가득찬 array를 만들고 싶을 때가 있습니다. 때로는 0으로 가득찬 array 중에서도 어떤 array의 sha..
2 by 2에서 역행렬을 구해보자. 개요 코드가 아닌 손으로 역행렬 계산을 했을 때, 어떤 과정을 통해 역행렬을 얻는 것인지 알아보자. 행렬의 shape은 2 by 2로 가정한다. 필요한 수식 우리는 determinant를 구할 때 ad - bc = 0인지 아닌지를 살펴본다. det이 0이면 역행렬이 없는 것이고, det이 0이 아니면 역행렬이 있는 것이다. 저 determinant를 구하는 식의 고향이 바로 역행렬을 구하는 수식이다. 아래와 같이 생겼다. 그냥 이 식에 그대로 값만 대입하면 된다! 값을 대입하여 역행렬을 구해보자. 우리가 가지고 있는 A는 [2,1],[1,2]라고 가정한다. 이렇게 간단하게 구할 수 있다. 이제 이를 이용해서 방정식을 한번 풀어보자. Ax=b 꼴에서 x는 주어져있지 않고 b만 [-2,1]로 주어졌다고 가정..
약수 찾기 알고리즘 개요 흔히 기본적인 알고리즘이라고 불리는 약수 찾이 알고리즘을 파이썬을 이용해 살펴보자. 나는 이 기본적인 알고리즘조차 구현해내지 못했다...^^ 약수 찾기 알고리즘 바로 본론으로 들어가겠다. 보통 약수 찾기는 이렇게 구현할 수 있다. 나는 생각 못했지만. a = 9 b = 10 for num in range(a, b + 1): for i in range(1, num + 1): if num % i == 0: print(i) 9와 10의 약수를 구해주는 코드이다. 난 왜 이것도 생각 못했지. 예전에 쓴 적은 있는 것 같은데... 더 효율적인 방식으로 들어가보자! a = 9 b = 10 for num in range(a, b + 1): for i in range(1, int(num**(1/2))+1): if..
cosΘ = np.dot(a, b) = ||a|| * ||b|| * cosΘ Gram-schmidt process를 위한 y hat을 얻어내는 수식을 유도하는 과정에서 cosΘ가 다른 식으로 표현될 수 있다고 말씀을 하셨는데 잘 모르는 부분이었어서 한번 들었을 때에는 흐름을 놓쳐버렸다. 멘토님께 설명을 듣고 보니, 원래 증명이 필요한 식인데 안다고 생각하고 넘어가신 거라고 하셨다. 위 그림은 cosΘ = np.dot(a, b)에서 np.dot(a, b)가 ||a|| * ||b|| * cosΘ와 같음을 증명하는 것이다. 외워두자.
determinant 역행렬이 존재하는지 판단하기 위해서 사용했던 det() 이 det은 determinant의 줄임말이다. determinant는 linear transformation을 위해 A에 입력벡터를 통과시켰을 때 얼마나 변화했는지의 정도를 나타내준다. 크게 두 가지를 보면 된다. 1. 어떠한 input이 matrix A를 통과하게 되면 부피(volume)이 얼마나 변하는가? 2. 어떠한 input이 matrix A를 통과하게 되면 방향(orientation)이 변하는가? 첫째로, 부피 차원에서 살펴보자. [1, 0], [0, 1]이라는 벡터 i, j로 만들어진 그래프가 있다고 하자. 이 벡터를 [[2, 0], [0, 2]]라는 matrix A에 통과시켜보도록 하겠다. 그럼 아래와 같이 벡터가 변하게 된다. mat..
다중집합 개요 다중집합이란 뭘까? 집합은 알겠는데, 앞에 다중이라는 말이 붙으니 순식간에 의미를 파악할 수 없게 됐다. 의미를 한번 알아보자. 도움이 된 블로그 https://velog.io/@munang/개념정리-파이썬-다중-집합 [개념정리] 파이썬 다중 집합의 교집합, 합집합 코테 연습할때마다 잊을만 하면 나오는 다중집합이다. 굳이 몰라도 되지만, 모른채 쓰려면 머지소트를 구현해야 하는 굉장한 번거로움이 있기때문에 알아두는게 좋을 것 같아서 포스팅 한다. 1. velog.io 내가 정리하는 것보다 이곳에서 의미를 확인하는 게 좋을 것 같아서 덩그러니 링크만을 남겨두려고 한다. 워낙에 정리를 잘해두셔서 이해가 쉽게 되었다.