목록기초 노트/Python (7)
플로라도의 data workout
파이썬에서는 이미지 입출력(image I/O)를 처리하는 정말 많은 라이브러리와 함수들을 제공하고 있다. 특별히 opencv를 사용하면 이미지를 RGB의 형태가 아닌 BGR의 형태로 읽어 색상값이 뒤직박죽 섞여 이를 적절히 섞어줘야 한다던가 하는 테크닉이 필요한 것은 알았지만,이미지를 로드하는 라이브러리와 함수에 따라 이미지 픽셀값의 분포가 다르다던지(1), EXIF라고 하는 사진의 메타 데이터의 반영여부가 달라진다던지(2) 하는 차이점을 최근에서야 알게 되었다. 1. PIL/Pillow- PIL(Python Imaging Library)의 후속으로 유지보수 되고 있는 라이브러리, 원래의 라이브러리는 Python 1.5-2.7을 지원하며, 2011년 PIL 저장소에 대한 마지막 커밋으로 중단되어 Pi..
판다스 데이터프레임의 인덱싱은 크게 세가지 방법이 있다. 1. ' [ ] ' 연산자2. iloc '위치 기반 선택'3. loc '라벨 기반 선택' 1. '[ ]' 연산자 @ka : 칼럼지정 연산자, 행 슬라이싱, 불리언 인덱싱데이터프레임에 ' [ ] ' 연산자를 적용, df ['column_name'] 와 같이 사용하는 것은 기본적으로 여느 다른 클래스와 마찬가지로 매직 메서드인 '__getitem__'에 의해 구현되어 있다. - 열 선택 df['column_name'] - 슬라이싱을 통한 행 선택df[2:5] 이때 유의점1은 df[3] 과 같이 단일 정수값으로 행을 선택하려고 들면 에러가 난다는 점이다. 데이터 프레임에서 ' [ ] ' 연산자는 '칼럼 지정 연산자'로 작동하며, 열 이름 자체가 '..
기본적으로 파이썬 클래스의 메서드들은 첫번째 인자로 'self' 매개변수를 포함시키는게 일반적이다. 'self'는 메서드가 호출될 때 해당 인스턴스 자체를 자동으로 참조하는 역할을 한다. 이를 통해 메서드 내에서 해당 인스턴스의 속성(attribute)이나 다른 메서드에 대해 접근할 수 있다. 그런데 이와는 달리, 첫번째 인자로 'self'가 아닌 'cls'를 받는 메서드가 존재한다. 바로 클래스 메서드(clasmethod)이다. 클래스 메서드의 경우, 'self'가 아닌 'cls'를 필수적으로 포함해야 한다. 1. 클래스 메서드 - 클래스 메서드는 메서드 선언시에 @classmethod의 데코레이터를 달아주어 정의하게 된다. - 클래스에서 직접 호출하는 점 때문에 인스턴스 객체를 수정할 수 없다. 클래..
'%cd'와 '!pip'에서 사용되는 '%'와 '!'는 IPython(주피터 노트북에서 주로 사용되는 Python 인터랙티브 쉘)의 특수 명령어 접두사다. 각각은 다른 목적과 기능을 가지고 있다. 1. '%' (매직명령어)'%'는 IPython의 매직 명령어를 나타내며, IPython 자체에 의해 처리된다. 이러한 명령어들은 일반적인 Python 코드와는 다르게 IPython환경을 위해 특별히 제작되었다. 예를 들어, '%cd'명령어는 현재 작업 디렉토리를 변경하는 IPython 매직 명령어이다. 매직 명령어는 IPython에 의해서만 인식되고 실행되며, Python 스크립트상에서는 사용할 수 없다. 2. '!' (시스템명령어)'!'는 주피터 노트북에서 시스템 쉘 명령어를 실행할 때 사용된다. 예를들어,..
앞선 글에서 mutable한 객체를 반복하고자 할때는 얕은 복사가 이루어져 동일한 메모리 값을 참조하게 된다고 했다. 그렇다면 mutable객체의 반복은 얕은 복사로 동일한 객체를 참조하는게 아니라 서로 다른 별개의 객체로 만들어 값만 복사할 순 없을까? 얕은복사와 깊은복사를 예시를 통해 다시 정리해보자. 얕은 복사 (Shallow Copy): 이 방법은 최상위 컨테이너는 새로운 복사본을 만들지만, 컨테이너가 담고 있는 내부 객체들은 원본 객체의 참조를 그대로 유지한다. Python의 copy 모듈의 copy() 함수를 이용하여 얕은 복사를 수행할 수 있다. import copy original_list = [[1, 2, 3], [4, 5, 6]] shallow_copied_list = copy.copy..
이중 리스트 같은 경우 간단히 리스트 컴프리헨션을 사용함으로써 초기화를 할 수 있다. array[1][1] = 3으로 할당하면 아래와 같이 두번째 row의 두번째 요솟값만 3으로 바뀐걸 알 수 있다. m = 3 n = 4 array = [[0]*m for _ in range(n)] array[1][1]=3 array >>> [[0, 0, 0], [0, 3, 0], [0, 0, 0], [0, 0, 0]] 그러나 만약 아래의 코드로 이중리스트를 초기화 한다고 하면 문제가 생긴다. array = [[0]*m]*n 으로 초기화 후 , array[1][1]=5를 할당하면 array= [[0]*m]*n array[1][1]=5 array >>> [[0, 5, 0], [0, 5, 0], [0, 5, 0], [0, 5..
nested_list = [ [1,2,3], [4,5,6], [7,8,9] ] (1) 2중 for문의 사용 flatten_list = [] for sublist in nested_list: for item in sublist: flatten_list.append(item) (2) 리스트 컴프리헨션의 사용 flatten_list = [item for sublist in nested_list for item in sublist] (3) 넘파이 사용 (thnkas to numpy!) import numpy as np nested_list = np.array(nested_list) flatten_list = nested_list.flatten.tolist() # 넘파이의 flatten 메서드를 사용할 경우, 이..