본문 바로가기

반응형

Computer

(114)
Shallow copy vs Deep copy 파이썬에서의 assignment operation (=)은 객체의 복사본을 만들지 않습니다. 메모리 상에 존재하는 하나의 객체에 대해 다른 변수이름을 binding 하는 것 뿐이죠. 따라서 리스트와 같은 변경 가능한 객체에 대해서 b=a 를 수행하고 a의 원소값을 변경하면 b의 값 또한 마찬가지로 변경됩니다. >>> a = [1,2,3,4] >>> b = a a[3] = 100 >>> a [1, 2, 3, 100] >>> b [1, 2, 3, 100] 하지만 문자열, 정수와 같은 불변 객체에 대해서는 적용되지 않습니다. a의 값을 다른 값으로 변경하면 a는 메모리 상의 다른 객체를 참조하고 b는 그대로 원래 객체를 참조합니다. >>> a = 10 >>> b = a >>> b 10 >>> a = 'abc'..
List Subtraction 두 개의 리스트 $x, y$가 있을 때 $x$ 리스트 원소 중 $y$ 리스트에 속한 원소를 제거하고 싶습니다. 예를 들면 다음과 같은 빼기 연산 (-)를 수행하고 싶은겁니다. >>> x = [1,2,3,4,5,6,7,8,9,0] >>> x [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] >>> y = [1,3,5,7,9] >>> y [1, 3, 5, 7, 9] >>> x - y # (should return [2,4,6,8,0]) 하지만 리스트 자료구조에 대해서는 빼기 연산 (-)를 지원하지 않으므로 다음과 같은 에러가 발생합니다. Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s)..
Onehot 인코딩의 역변환 (inverse transform) 범주형 데이터 (categorical data)를 수치화하는 방법은 대표적으로 1) 0부터 범주 개수까지 범위의 숫자를 할당하는 nominal 인코딩 (Label encoding), 2) 각 범주마다 1의 값을 가지는 dummy variable을 생성하는 onehot 인코딩 방법이 있습니다. (물론 다른 방법들도 있습니다.) 특히, one-hot 인코딩은 Pandas의 get_dummies 함수를 이용해서 쉽게 수행할 수 있었는데요, 이 함수를 사용할 경우 inverse_transform 함수가 정의되어 있는 scikit-learn 함수와는 달리 변환 이후에 원래 데이터 양식으로 역변환 함수를 따로 만들어줘야 합니다. 다음과 같은 데이터프레임이 있다고 가정했을 때 get_dummies 함수를 이용하면 p..
파이썬의 GIL 사용 이유 파이썬 구현체 CPython의 GIL (Global Interpreter Lock)은 파이썬 바이트코드를 실행할 때, 여러 쓰레드 중 하나의 쓰레드만이 파이썬 객체에 접근할 수 있게 하는 mutex (mutual exclusive) 로서 하나의 프로세스의 공유 리소스를 하나의 쓰레드만이 점유하게 하는 장치입니다. 따라서 파일 읽기/쓰기, 네트워크 통신 등과 같은 I/O 작업이 아닌 행렬연산, 이미지처리 등 CPU를 많이 사용하는 작업에 대해서는 파이썬의 멀티쓰레드로는 성능향상을 기대할 수 없는데요, 다음 코드를 보면 다중쓰레드가 락 (mutex)의 획득, 해제에 따른 오버헤드로 인해 실행 시간이 더 길게됩니다. # single_threaded.py import time from threading impo..
Decorator 에서 함수 디폴트 인자 파악 방법 데코레이터는 자신이 감싸고 있는 함수가 호출되기 전과 후에 코드를 추가로 실행하는 파이썬의 문법으로 여러 함수에 대해 동일한 기능을 수행시키고 싶을 때 주로 사용합니다. 다음 코드와 같이 장식할 함수를 인자로 받아 wrapper 함수에서 인자로 받은 함수를 수행하고 wrapper 함수가 반환되므로 sample 함수 호출 시 전달한 인자는 wrapper 함수의 인자 *args, **kwargs가 됩니다. def trace(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) print(f'{func.__name__}') print(f'Arguments: {args!r}, Keywords: {kwargs!r}', end = '') retur..
namedtuple 인스턴스 확인 collections 내장모듈의 namedtuple은 tuple의 불변성과 클래스의 속성접근 특성을 합친 많이 쓰이는 파이썬의 자료구조입니다. 다음과 같이 issubclass 내장함수를 사용하면 namedtuple로 선언한 클래스가 tuple의 자식클래스임을 알 수 있습니다. >>> Point = namedtuple('Point', ['x' 'y']) >>> pt = Point([1,2]) >>> issubclass(Point, tuple) True 그렇다면 우리가 다루는 인스턴스가 namedtuple 자료구조로부터 왔는지 어떻게 확인할 수 있을까요? 먼저 type 함수를 통해 pt 인스턴스의 타입을 살펴보면 namedtuple로 선언한 클래스 이름이 나옵니다. 하지만 우리는 클래스 이름을 모르는 상황을..
Pandas Multiple Columns Label Encoding Pandas 데이터프레임 형태의 데이터를 머신러닝 알고리즘에 적용하기 위해서는 범주형으로 존재하는 칼럼을 어떻게든 수치화시켜주어야 합니다. Scikit-learn이나 pandas 패키지의 함수를 가지고 쉽게 수행할 수 있으며 대표적인 방법으로는 1) 범주의 개수만큼 열을 새롭게 생성하여 해당하는 범주의 열에 대해서 1, 나머지 열에 대해서는 0을 할당하는 one-hot 인코딩과 (pandas.get_dummies) 2) 0부터 범주 개수 -1 만큼의 수를 각 범주에 할당하는 Label 인코딩이 있습니다. 보통 one-hot 인코딩을 주로 사용하나 추후 Pytorch 같은 딥러닝 프레임워크를 이용할 때에는 정의된 크로스엔트로피 로스의 타겟이 라벨 인코딩 형태로 되어있기 때문에 Label 인코딩을 수행해야하..
파이썬의 memory management 파이썬 또한 프로그래밍 언어이기 때문에 컴퓨터 메모리 (RAM) 상에 데이터를 저장하고 (write) 읽는 (read) 작업을 수행해야합니다. 파이썬 프로그램이 수행된다면 데이터를 저장할 메모리 공간을 할당받고 더 이상 쓰이지 않는 메모리 공간을 해제하는 작업이 필요하다는 것이죠. 그렇다면 파이썬 프로그램에서 물리 메모리 상의 특정 공간까지 데이터 read/write는 어떤 방식으로 이루어질까요? 파이썬 코드가 컴퓨터 상에서 실제로 수행되기 위해서는 컴퓨터가 이해할 수 있는 특정한 종류의 언어로 먼저 변환되어야 합니다. 파이썬은 C 언어로 구현된 CPython으로 구현되어 있고 CPython은 파이썬 코드를 컴퓨터가 이해할 수 있는 어셈블리 언어와 비슷한 bytecode로 파이썬 코드를 컴파일합니다. B..

반응형