*썸네일은 YBG님이 공유해주신 어디선가 본 메모이제이션(memoization)의 제일 신박해보이는 코드
LMS
파이썬 배열은 동적 배열(변수 할당 시 크기를 지정 안 해줘도 됨)
아 list
와 array
는 서로 다르단다...
: 리스트는 array 와는 다르게 연속된 위치가 아닌 떨어진 영역에 저장된다는 점(입력, 삭제 시 array
는 일렬로 저장되어 있어서 계속 밀고 당기고 함.)
import array
로 파이썬의 자체 어레이 타입은 불러와야 함(built-in 아님)
array
, numpy
는 요소들끼리 같은 타입이어야 함
Numpy!
type이 다 같아야 해서 str 들어가면 다 str으로 바뀜
C = np.array([0,1,2,3,'4'])
>>> ['0' '1' '2' '3' '4']
type()
과 numpy.array.dtype()
의 차이가 있음
: dtype은 해당 어레이 원소들의 데이터 타입을 알려줌
뭐가 섞여 있으면 그냥 object
dtype으로 반환
D = np.array([0, 1, 2, 3, [4, 5], 6]) # 이런 ndarray도 만들어질까요?
print(D)
print(D.dtype)
print(type(D))
>>>
[0 1 2 3 list([4, 5]) 6]
object
<class 'numpy.ndarray'>
str
끼어 있으면 int
를 str
로 바꾸지만, object
에서는 int
를 살려둠
C = np.array([0,1,2,3,'4',5])
print(C[0])
print(type(C[0]))
print(C[4])
print(type(C[4]))
print("------------------------------")
D = np.array([0,1,2,3,[4,5],6], dtype=object)
print(D[0])
print(type(D[0]))
print(D[4])
print(type(D[4]))
>>>
0
<class 'numpy.str_'>
4
<class 'numpy.str_'>
------------------------------
0
<class 'int'>
[4, 5]
<class 'list'>
arr.T
와 arr.transpose()
랑 뭔가 다름arr.T
는 0번째, -1번째 축을 서로 바꾸고 arr.transpose()
는 바꾸는 축을 지정할 수 있는 것 같다.numpy
의 arithmetic operator +,-,*,/은 기본적으로 position-wise로 실행됨hash
의 개념 : Hash란 Key와 Value로 구성되어 있는 자료 구조로 두 개의 열만 갖지만 수많은 행을 가지는 구조체Series
도 구조형 데이터이다(인덱스, 값으로 구조가 된다)Series
에 dict
를 넣으면 키가 인덱스가 된다pd.DataFrame.info()
는 각 column
들의 Null 값과 자료형을 보여줌pd.DataFrame[컬럼명].value_counts()
로 각 범주별 갯수 확인 가능풀잎스쿨
lambda
filter(함수, iterable)
True
, False
를 반환하는 함수여야 하는 것 같다reduce(함수, iterable)
에서 함수의 반환값이 1개든 2개든 iterable의 요소를 왼쪽부터 끝까지 줄여가면서 꺼내준다.# 예시코드 1
def f(x,y):
return x + y # 인자로 2개 받고 반환 1개
a = [1,2,3,4,5,6,7]
from functools import reduce
reduce(f,a)
>>> 28
# 예시코드 2
def f(x,y):
return x, y # 인자로 2개 받고 반환 2개
a = [1,2,3,4,5,6,7]
from functools import reduce
reduce(f,a)
>>> ((((((1, 2), 3), 4), 5), 6), 7)
reduce()
는 약간 직관적으로 알아보기 힘들고, for loop
으로 하는 게 더 빨라서 퇴화되어 가는 함수인 듯하다.
이미지 -> Numpy 행렬로 변환하기
1) Image
모듈 불러오기
2) Image.open(path)
로 불러오고 객체 만들기
3) 그 객체를 np.array(객체명)
에 넣으면 행렬로 바뀐 게 반환됨
*args
, **kwarg
의 개념(함수 정의할 때 arguments 자리에 넣는 것들)
:*args
은 muliple values가 오게끔 자리를 만들어 놓음
:**kwarg
은 muliple key_value paris가 오게끔 자리를 만들어 놓음
# 예시코드
def personal_info(**kwargs):
for kw, arg in kwargs.items():
print("key :", kw, "|", "value :", arg)
personal_info(name='DJ', age=18, sex='male') # 꼭 이런 형태여야 하는 듯
>>>
key : name | value : DJ
key : age | value : 18
key : sex | value : male
my_info = {'city':'Yongin', 'street':'Moonjeong_ro', 'house_num':'101-104'}
personal_info(my_info) # 딕셔너리 형태로 넣으면 위치인수로 인식
>>>
TypeError: personal_info() takes 0 positional arguments but 1 was given
np.random.uniform
에서 균등분포는 찾아보니 값이 다 같다는데, 왜 코딩 출력값은 다른걸까?list
슬라이싱과 ndarray
슬라이싱 방법이 헷갈린다...list
에서는 [] 안에 integer 혹은 slices만 들어가란다..(, 안됨)list[a:b:c]
에서 a : start / b : stop(not included) / c : stepnumpy
ndarray
의 표현 순서Image
로 가져와서 np.array(img 객체)
넣어주면img.shape >>> (300, 212, 3)
pd.DataFrame.var
와 pd.DataFrame.var()
의 차이는 뭘까?pd.Series.argmin()
과 pd.Series.idxmin()
의 차이(헷갈린다...)