[AIFFEL] 21.Dec.31 - How to express arrays

Deok Jong Moon·2021년 12월 31일
0
post-thumbnail

*썸네일은 YBG님이 공유해주신 어디선가 본 메모이제이션(memoization)의 제일 신박해보이는 코드

오늘의 학습 리스트

LMS

  • 파이썬 배열은 동적 배열(변수 할당 시 크기를 지정 안 해줘도 됨)

  • listarray는 서로 다르단다...
    : 리스트는 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 끼어 있으면 intstr로 바꾸지만, 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'>
  • 리스트의 '+' 연산자는 concatenate, ndarray는 브로드캐스팅 혹은 산수 연산
  • arr.Tarr.transpose()랑 뭔가 다름
    :arr.T는 0번째, -1번째 축을 서로 바꾸고 arr.transpose()는 바꾸는 축을 지정할 수 있는 것 같다.
  • numpy의 arithmetic operator +,-,*,/은 기본적으로 position-wise로 실행됨
  • hash의 개념 : Hash란 Key와 Value로 구성되어 있는 자료 구조로 두 개의 열만 갖지만 수많은 행을 가지는 구조체
  • Pandas!
    • Series 도 구조형 데이터이다(인덱스, 값으로 구조가 된다)
    • Seriesdict를 넣으면 키가 인덱스가 된다
    • pd.DataFrame.info()는 각 column들의 Null 값과 자료형을 보여줌
    • 범주형 데이터의 컬럼은 pd.DataFrame[컬럼명].value_counts()로 각 범주별 갯수 확인 가능

풀잎스쿨

  • 재귀함수
    : 최대 재귀 깊이(maximum recursion depth)가 1,000개로 정해져 있다.
    : stack overflow를 방지하기 위해 memoization 사용할 수 있음
  • lambda
    • filter(함수, iterable)
      : 여기서 함수는 True, False를 반환하는 함수여야 하는 것 같다
      : 그래서 iterable에서 True인 것만 filter해낸다.
  • 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 : step
  • numpy ndarray의 표현 순서
    예) (4,3,2) -> 표현 되는 건, 4 : 깊이 / 3 : 행 / 2 : 열
    그런데 실제로는 이게 (2, 3, 4)로 표현되어야 하는 거...?
    이미지를 행렬화 하면 (Height, Width, Depth)
    => 가로(212px), 세로(300px), 컬러(RGB) 이미지를 Image로 가져와서 np.array(img 객체) 넣어주면
    => img.shape >>> (300, 212, 3)
  • pd.DataFrame.varpd.DataFrame.var()의 차이는 뭘까?
  • pd.Series.argmin()pd.Series.idxmin()의 차이(헷갈린다...)
    => arg는 최소, 최대값 자체를 반환해주고, idx는 그 값들의 인덱스를 반환해준다.
profile
'어떻게든 자야겠어'라는 저 아이를 닮고 싶습니다

0개의 댓글

관련 채용 정보