for key, val in params.items():                                 
    self.v[key] = np.zeros_like(val) 

이 게시글은 이 코드를 이해하기 위해서 작성되었다.

 

1. 반복문과 딕셔너리의 이해

 

먼저 NumPy를 사용하지 않은 코드를 먼저 살펴보자.

dic1 = {'a':0, 'b': 1, 'c':2}
dic2 = {}

for key, val in dic1.items():
    dic2[key] = val+1

심플하게 생각해보면, dic1의 value에 1을 더해 dic2에 저장한다는 느낌이다. 실제로 dic2를 찍어보면 

{'a': 1, 'b': 2, 'c': 3} 과 같은 결과를 얻을 수 있다. 

 

그렇다면 대체 items() 메소드는 무슨 역할을 하는걸까. 

책 '점프 투 파이썬' 에 따르면 

items 함수는 Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려준다. dict_values 객체와 dict_items 객체 역시 dict_keys 객체와 마찬가지로 리스트를 사용하는 것과 동일하게 사용할 수 있다.

라고 한다. 

 

실행 후에 key와 val을 찍어보면 

key
Out[30]: 'c'

val
Out[31]: 2

다음과 같은 결과를 얻을 수 있다. 이 두 값은 dic1 딕셔너리 변수의 마지막 key와 value 값이다. 

과연 Python은 어떻게 이 반복문을 작동시키는 것일까?

 

디버그를 통해서 확인해보면 key와 val에는 순서대로 (a, b, c) (1, 2, 3) 이 저장된 것을 확인할 수 있다. 

 

즉 Python의 반복문에서는 변수를 2개 이상 받을 수 있으며, 이를 차례대로 넘겨줌을 알 수 있다. 

 

 

2. np.zeros_like

 

arr1 = np.array([[1,2],[3,4]])

먼저 다음과 같은 2차원 NumPy 행렬을 만들었다.

arr2 = np.zeros_like(arr1)

arr2
Out[53]: 
array([[0, 0],
       [0, 0]])

다음과 같이 np.zeros_like() 를 실행하였다. 그 결과 모양과 차원이 동일하지만, 내부 값이 0인 행렬이 나오는 것을 확인할 수 있다.

 

 

 

마지막으로 원본 코드를 다시 살펴보자

for key, val in params.items():                                 
    self.v[key] = np.zeros_like(val) 

  즉 params라는 dict변수에는 특정한 NumPy행렬이 저장되어 있을 것이며, 형태는 유지시키고 값은 0으로 하여 v라는 dict변수에 key값을 그대로 하여 복사한 것이다. 

'머신 러닝 및 파이썬 > Numpy 공부' 카테고리의 다른 글

행렬 곱셈, 내적  (0) 2020.03.04
Numpy의 Shape  (0) 2020.03.04
Numpy의 log  (0) 2020.02.27
Numpy의 Dimension  (0) 2020.02.27

+ Recent posts