프로그래밍 언어 35

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를 그린다면 다..

numpy array를 사용할 때 for문을 피해야하는 이유

Avoid for loops with numpy array numpy는 배열을 효율적으로 다룰 수 있도록 만들어진 라이브러리입니다. 같은 배열을 저장하고 있더라도 list에 비해 효과적으로 메모리를 사용하고, tensor간 연산을 지원해 계산 속도에서도 큰 이점을 가집니다.1 요소별로 연산을 필요로 할 때, for 문을 활용해 계산을 하면 numpy의 장점을 활용하지 못합니다. numpy는 범용 함수(ufunc)을 지원하기 때문에 for문을 사용할 때와 비교가 안될 만큼 효율적인 요소별 계산을 할 수 있습니다. 아래 예를 보게 된다면 numpy 배열에 요소별 연산을 할 때 for 문이 얼마나 비효율적인지 알게 됩니다. 속도 뿐만 아니라 코드를 작성할 때도 for 문을 사용하지 않아도 되기 때문에 간결하게..

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는 파이썬의 키워드로 사용하고 있기 때문에 사용할 수 없지만 ..