Python 23

numpy array broadcasting

Numpy를 활용한 배열 연산 numpy는 python에서 텐서 연산을 효율적으로 수행할 수 있도록 해주는 라이브러리 수학적으로 벡터의 요소별 연산을 할 때, 텐서의 shape이 일치하지 않으면 계산할 수 없음 예를 들어, $x = [1, 2, 3]$인 3차원 벡터의 각 요소에 1씩 더해주려면 x + np.array([1,1,1])처럼 계산 하지만 numpy에서는 배열의 형태가 달라도 의도한 계산을 할 수 있는 broadcasting을 지원하기 때문에 x + 1로 같은 결과를 얻음 2차원 배열에서도 다음과 같이 broadcasting이 적용된 연산을 할 수 있음. Broadcasting rule 위의 예시에서는 낮은 차원의 예시이기 때문에 쉽게 이해하고 적용할 수 있지만, 차원이 높아짐에 따라 규칙을 명..

short-circuit evaluation

short-circuit Evaluation and나 or로 boolean 값을 다룰 때 연산을 최소화하기 위한 방법and and는 두 값이 모두 참일때만 True를 반환하고 나머지 경우에는 False를 반환 (A and B)에서 A가 False $\to$ A가 거짓이면 B 연산 안함 A가 True면 B의 참, 거짓이 (A and B)의 참거짓을 결정 $\to$ B를 반환 or or은 두 값 모두 거짓일때만 False를 반환하고 나머지 경우에는 True를 반환 (A or B)는 둘 중 하나만 참이면 True $\to$ A가 참이면 B 연산 안함 마찬가지로 A가 False이면 B의 참, 거짓이 (A or B)의 참거짓을 결정 $\to$ B를 반환 Bitwise Operators boolean 연산의 두 o..

jupyter module autoreload

jupyter notebook의 module load jupyter lab이나 notebook을 사용할 때 가장 불편했던 점이 어느 정도 프로젝트가 진행 된 후 자주 사용되는 함수들을 모듈화 시켜 .py 파일로 저장했을 때, py 파일을 수정했을 때 kernel을 재시작해야 반영이 되는 점이었다. 노트북에 두 줄의 코드를 입력하는 것으로 커널을 매번 재시작하지 않고 모듈의 수정사항을 반영할 수 있다. Reference [1] ipython autoreload document

*args와 **kwargs 활용하기

open source 라이브러리를 사용하며 문서를 찾다 보면 *args와 **kwargs가 사용되는 것을 볼 수 있다. 두 키워드는 해당 함수에 여분의 argument를 전달해 줄 수 있는 방법이다. *는 필요한 parameter 이외에 추가로 전달되는 argument를 tuple로 전달하고, **는 dictionary 형태로 전달한다. 여기에서 중요한 부분은 *와 **로, *나 **뒤에는 args, kwargs 대신 어떤 단어를 사용해도 좋다. *와 **를 활용해 함수를 정의하는 것 뿐만 아니라 argument를 tuple이나 dictionary 형태로 함수에 전달할 수 있다. dictionary 형태로 argument를 전달하는 방식은 머신러닝 모델을 정의할 때 많이 사용하게 된다.

matplotlib 테마 설정하기

Matplotlib style matplotlib을 기본의 기본 설정을 사용하면 다소 투박한 배경에 그래프가 그려진다. 우연히 python에서 ggplot을 사용해 그린 그래프를 보고 아름답다고 생각을 해 다른 라이브러리를 공부해보려고 생각했다. 필요한 기능의 대부분을 matplotlib으로 해결을 할 수 있다보니 다른 라이브러리를 공부하는 것을 계속 미루던 참에 matplotlib의 style을 바꿀 수 있는 방법을 발견했다. Seaborn style 사용하기 matplotlib 외에 처음 알게 된 라이브러리는 seaborn이다. seaborn은 matplotlib에 기반해 좀 더 아름답고 효과적으로 데이터 시각화를 도와주는 라이브러리이다. seaborn은 5가지 기본 테마를 제공한다. sns.set_..

lambda 함수

이 글은 슬기로운 파이썬 트릭의 내용을 정리한 글입니다. 3.2 람다는 단일 표현식 함수다 lambda 키워드는 익명 함수를 선언하는 방법이다. 익명 함수라는 말은 함수를 def function_name(parameters): 와 같은 방식으로 선언한 경우 함수 객체를 function_name에 바인딩해 사용하는데 그럴 필요가 없다는 말이다. 아래의 add 함수와 add_lambda는 같은 역할을 한다. 람다 함수를 사용하게 되면 코드 def로 함수를 선언하는 몇 줄을 줄일 수 있지만 과도하게 사용하면 코드의 유지보수 측면에서 악영향을 줄 수 있다. 사용의 간결함과 유지보수의 악영향을 주지 않는 적정선에서 사용하는 것이 좋다. 람다 함수를 사용하기 좋은 경우 list를 sorting할 때 key를 정의할..

유연한 matplotlib subplot 사용하기

figure canvas를 분할하는 subplot 하나의 이미지에 다단으로 이미지를 삽입하고자 할 때 subplot으로 canvas를 분할하고 위치를 지정할 수 있다. plt.subplot(행, 열, 인덱스) 행과 열에서 형태를 지정하고 인덱스로 그래프를 넣을 위치를 지정하게 된다. canvas를 행과 열에 맞게 분할하고 인덱스로 figure를 삽입할 위치를 지정한다. 아래는 plt.subplot(3,2,idx)로 canvas를 분할한 예시이다. 고정된 분할 예를 들어 canvas를 4개의 행으로 분리해 4개의 figure를 그리고 싶을 때는 plt.subplot(4,1,인덱스)를 고정으로 사용하면 된다. 유연한 분할 만약 1행에는 1개의 figure를 그리고, 2행에는 3개의 figure를 그린다면 다..

python 함수를 아름답게 사용하기

이 글은 슬기로운 파이썬 트릭의 내용을 정리한 글입니다. 3.1 파이썬 함수는 일급 객체다 파이썬에서 함수는 객체이기때문에 변수에 할당하고 데이터 구조에 저장하고 다른 함수에 인자로 전달하고, 함수의 값에서 반환할 수 있다. 이 한 문장이 이 포스팅의 요약이다. 개인적으로 문자형을 다루는 예시보다 숫자를 다루는 것이 이해가 더 잘 될 것이라고 생각해 성과금 관련 상황으로 예시를 수정했다. 함수는 객체(object)다 파이썬에서 모든 것은 객체이고 변수에 할당된다. 함수도 마찬가지로 변수에 할당될 수 있다. 위와 같은 경우에 level_1 뒤에 ()가 붙지 않아 호출되지 않고, add_one은 level_1 함수를 가리키는 변수가 된다. one 변수로 plus_one 함수를 호출할 수 있다. 이때 del ..

_var, var_, _var_, __var__과 같이 선언된 변수의 의미를 설명

2021-04-02 수정 dunder method 예제 추가* 이 글은 슬기로운 파이썬 트릭의 내용에 기반해 작성한 글입니다. 2.4 밑줄 문자와 던더 파이썬에서 변수명에 밑줄을 추가하는 경우가 있는데 각각은 의미를 가진다. _var 변수 앞에 하나의 _를 붙이는건 method 내부에서만 쓰일 것이라는 의도를 알리는 목적 이 방식으로는 해당 변수에 접근하는 것을 방해하지는 않음 그러나 from module import *와 같은 와일드 카드 임포트방식으로 모듈을 불러오는 경우에 _가 앞에 붙은 것은 모두 가져오지 않음 var_ 이 경우에는 python에서 변수로 사용할 수 없는 이름으로 선언하고 싶은 경우에 사용 예를 들면, class나 int는 파이썬의 키워드로 사용하고 있기 때문에 사용할 수 없지만 ..

unittest, Test-driven develope를 위한 라이브러리

Test-driven develop(TDD)는 개발이 끝난 후에 테스트를 진행하는 것이 아니라, 작은 단위의 기능을 수행하는지 여부를 테스트를 통과한 코드를 전체 코드에 리팩토링해 병합하는 방식의 개발 방법을 이야기합니다. TDD의 시작은 unittest를 작성하는 것입니다. Unit test code를 테스트 하는 것은 bug가 없이 의도한 바를 구현하는데 중요하지만 데이터 사이언스에서 쉽게 간과됨 프로젝트가 커지고 복잡해짐에 따라 예상치 못한 버그가 발생할 가능성이 매우 높음 unittest는 작성한 코드가 의도한대로 작동하는지 여부를 검증하는 과정 unit test의 필요성 testing을 작성하는 것은 문제가 없이 clean하고 사용성 높은 코드를 작성하는데 필수적임 어느 이상의 양을 가지는 복잡..