NOTATION. arr
: 넘파이 배열
- n차원 배열 생성. 각 값은 [0, 1)
range()
와 같은 역할 + 실수값의 step 사용 가능
- 구간 [start, stop]을 균등하게 분할한 num개 지점에 대한 배열 생성
- int, float 데이터 타입의 표현 가능한 수의 한계를 반환
- 선형 연립 방정식 풀이(a: 계수, b: 상수)
-
함수를 element-wise하게 활용될 수 있도록 변환
np.vectorize(lambda x: x-1)(np.array([1, 2, 3])) # 원소 하나에 대해 1을 빼는 연산 실행 array([0, 1, 2])
-
실용적: 데코레이터 활용
@np.vectorize def foo(x): return -1 if x > 1 else 1 # 아래와 같은 표현임 def foo(x): return -1 if x > 1 else 1 foo = np.vectorize(foo) arr = np.array([0, 1, 2]) foo(arr) # array([ 1, 1, -1])
- 객체의 차원 반환
- 배열 내 자료형 메모리 크기(byte)
- 배열 내 성분 개수
- 배열을 정렬했을 때, 순서가 바뀐 인덱스 리스트를 반환
- 32bit 배열 + 64bit 배열: 결과값은 64bit 배열
NOTATION. df
: 판다스 데이터프레임, srs
: 판다스 시리즈
scipy
라이브러리의 sparse matrix로부터 데이터프레임을 만들고자 할 떄 활용하는 함수
-
컬럼 속성을 Categorical로 변환. Label Encoding을 진행할 떄 유용
temp = pd.Series([10,20,30,20,10]).to_frame('cat') temp['cat'] = pd.Categorical(temp['cat']) # 해당 변수 type이 Categorical이 됨 temp['cat_ID'] = temp['cat'].cat.codes # 각 클래스별 ID는 cat.codes 인스턴스를 호출하여 구함
-
데이터프레임의 각 row를 튜플 형태로 iterating. iterating되는 객체는
pandas.core.frame.Pandas
type을 지님for row in df_ratings.itertuples(index=True): # index를 False로 설정할 경우 index 미포함 print(row) ''' ... Pandas(Index=30386, userId=212, movieId=59369, rating=3.0) Pandas(Index=30387, userId=212, movieId=59784, rating=4.0) Pandas(Index=30388, userId=212, movieId=60069, rating=4.0) Pandas(Index=30389, userId=212, movieId=61024, rating=2.5) Pandas(Index=30390, userId=212, movieId=64034, rating=3.0) ... ''' row[0] # 30390 <- 인덱싱을 통한 접근 row.Index # 30390 <- 키값을 통한 접근
-
데이터프레임의 각 row를
(index, srs)
의 형태로 iterating.for row in df_ratings.iterrows(): print(row) ''' ... (2658, userId 19.0 movieId 2052.0 rating 2.0 Name: 2658, dtype: float64) (2659, userId 19.0 movieId 2053.0 rating 2.0 Name: 2659, dtype: float64) ... '''
-
가령, 하나의 컬럼을 제외하려는 경우, 약 770배 가량의 차이가 났음. 데이터 크기에 따라 차이 정도는 상이하겠지만, 명백히
iloc/loc
를 사용하는 것이 빠름def foo(): user_tfidf.drop('post_meta_id', axis=1) %timeit foo() # 100 loops, best of 5: 1.24 ms per loop def foo(): user_tfidf.iloc[:, 1:] %timeit foo() # 1000 loops, best of 5: 161 µs per loop
-
가상환경에서 글꼴 변경하기
-
다음과 같이 코드별로 글꼴 정보를 입력하여 변경. 가상환경에서 전사적인 변경 방법은 아직 찾지 못함
path = './fonts/AppleSDGothicNeoM.ttf' fontprop = fm.FontProperties(fname=path, size=18) plt.rc('font', family=font_name) plt.title('한글 제목', fontproperties=fontprop) plt.show()
-
-
대용량 sparse 데이터를 핸들링할 때 유용하게 활용 가능
-
csr_matrix
: 행을 기준으로 sparse 데이터를 압축 -
csc_matrix
: 열을 기준으로 sparse 데이터를 압축>>> import scipy.sparse >>> sparse_matrix = scipy.sparse.csc_matrix(np.array([[0, 0, 3], [4, 0, 0]])) >>> sparse_matrix <2x3 sparse matrix of type '<class 'numpy.int64'>' with 2 stored elements in Compressed Sparse Column format> >>> sparse_matrix.todense() matrix([[0, 0, 3], [4, 0, 0]], dtype=int64) >>> scipy.sparse.save_npz('/tmp/sparse_matrix.npz', sparse_matrix) >>> sparse_matrix = scipy.sparse.load_npz('/tmp/sparse_matrix.npz') >>> sparse_matrix <2x3 sparse matrix of type '<class 'numpy.int64'>' with 2 stored elements in Compressed Sparse Column format> >>> sparse_matrix.todense() matrix([[0, 0, 3], [4, 0, 0]], dtype=int64)
-
여러 딕셔너리를 하나로 통합할 때 활용. 리스트 내 딕셔러니를 일괄 언패킹하여 통합함
>>> from collections import ChainMap >>> d1 = {1: 'one', 2: 'two'} >>> d2 = {3: 'three'} >>> ds = [d1, d2] >>> dict(ChainMap(*ds)) {1: 'one', 2: 'two', 3: 'three'}
-
Meta characters:
.
^
$
*
+
?
{
}
[
]
\
|
(
)
-
Character Class(
[ ]
):[ ]
사이의 문자들과 매치-
예:
[abc]
- 'a': a가 포함되어 매치
- 'before': b가 포함되어 매치
- 'dude': 해당되는 것이 없어 매치 X
-
[0-9]
: 0부터 9까지,[a-c]
- a부터 c까지 -
[^0-9]
: 숫자가 아닌 것들만 매치(^ - not) -
\d
: 숫자와 매치(=[0-9]
) -
\D
: 숫자가 아닌 것과 매치(=[^0-9]
) -
\s
: whitespace 문자와 매치(=[ \t\n\r\f\v]
) -
\S
: whitespace 문자가 아닌 것과 매치(=[^ \t\n\r\f\v]
) -
\w
: 문자 + 숫자와 매치(=[^a-zA-Z0-9_]
)*대문자로 사용된 것은 소문자의 반대
-
-
Reference. 점프 투 파이썬 - 정규표현식
*from datetime import datetime as dt
- 문자열 타입의 날짜 데이터를 datetime 자료형으로 변환
- datetime 객체에 시차를 주고자 할 때 사용
-
iterable 객체를 iterator로 변환.
next()
함수를 통해 iterating이 가능iterable_ = range(10) iterator = iter(iterable_) # type: range_iterator next(iterator) # 0, 1, 2, ... , 9 / 마지막 이후에는 StopIteration
- 경로 중 파일명만을 추출
- iterable 객체의 모든 원소가 True인 경우 True
- iterable 객체의 적어도 한 원소가 True인 경우 True
-
generator에 활용. 쥐고 있던 원소를 다 털어내면 아무 값도 뱉지 않고 에러도 나지 않음
def gen(): ls = range(10) for value in ls: yield value temp = gen() for i in range(temp): print(i) # 0, 1, 2, ... , 9
- 지역변수이외의 변수에 접근할 때 사용하는 명령어
-
global
: 함수 내 함수로 겹겹이 쌓이더라도,global
이 사용된 지역변수는 전역변수로 연결. 권장되지 않는 명령어 -
nonlocal
: 사용된 함수의 바로 한 단계 바깥에 위치한 변수와 바인딩-
함수를 한 개 정의하고 전역변수에 영향을 주는 것은 불가능
x = 70 def foo(): nonlocal x x = 140 foo() print(x) # SyntaxError: no binding for nonlocal 'x' found
-
-
Reference. https://devbruce.github.io/python/py-13-global,nonlocal/
- 문자열이 영어, 한글 또는 숫자로 구성되어 있으면 True, 아니면 False
- 문자열이 영어 또는 한글로 구성되어 있으면 True, 아니면 False
- 딕셔너리의 value값이 가장 큰 키값을 추출
- pyenv: 로컬 파이썬과 별개의 파이썬 버전을 마련하는 것
- virtualenv: 기존 파이썬 패키지 폴더와 독립적인 파이썬 패키지 폴더를 마련하는 것. venv 간 파이썬 버전을 공유할 수 있음
- 함수를 선언하거나 전역 변수 등을 선언했을 때 컴파일 단계에서 일정한 규칙을 갖고 변경되는 것
- Linker가 다른 Scope에 있는 같은 이름의 함수와 변수에 대해 구별할 수 있도록 하는 요소로, 컴파일러 입장에서 중요한 작업
- 컴파일러는 함수에 대하여 함수의 이름, 파라미터 타입, Calling Convention 등을 사용하여 이름을 생성
- Reference. Name Mangling
- iterable 객체의 _next_() 메소드를 호출하는 역할을 수행한다.
-
인스턴스 메서드와 달리
self
인자를 전달하는 것이 아닌cls
인자(클래스 자기 자신)를 전달 -
인스턴스 메서드는 인스턴스에 국한하여 데이터를 사용하나, 클래스 메서드는 인스턴스가 공유하는 클래스 데이터 활용 가능
class Store: def __init__(self, temp1, temp2): self.temp1 = temp1 self.temp2 = temp2 @classmethod def foo(cls, double): return cls(double, double) def foo2(self): return self.temp1 + self.temp2 origin = Store(1,2) print(origin.foo2()) # 1 + 2 = 3 shared = origin.foo(3) # 내부 인스턴스를 변경한 채로 새로운 객체에 할당 print(shared.foo2()) # 3 + 3 = 6
-
같은 내용의 연산이더라도 loop를 적게 하는 것이 무조건 빠름
-
여러 리스트를 공유된 loop에서 만드려고 할 때는 list comprehension이 아닌 일반적인 for loop를 활용하는 것이 좋다고 한다.
def foo(): a1, a2 = [], [] for i in range(10): a1.append(i) for j in range(10): a2.append(j) return a1, a2 %timeit foo # 10000000 loops, best of 3: 28.4 ns per loop def foo(): a1, a2 = [], [] for i in range(10): a1.append(i) a2.append(j) return a1, a2 %timeit foo # 10000000 loops, best of 3: 28 ns per loop
-
len()
의 시간 복잡도는 O(1)이지만, 반복적으로 호출할 때는len()
값을 변수에 할당해둔 뒤, 해당 변수를 불러오는 것이 좋음 -
라고 생각했는데 다시 측정해보니 별 차이 없음
def foo():
foo = 1
return foo
temp = foo()
print(temp, type(foo), foo) # 1 <class 'function'> <function foo at 0x7f9bf305b488>